【问题标题】:Iteration through list with for使用 for 遍历列表
【发布时间】:2013-05-08 11:23:39
【问题描述】:

我是 Python 的新手。 想象一下我有一个列表[100, 200, 300, 301, 315, 345, 500]。我想从中创建一个新列表,例如[100, 200, 300, 500]。

当我像这样遍历列表时:

for i in range(len(list)):
    while (list[i+1] - 100) <= list[i]:
        i = i + 1
        k = list[i]

然后 i 在 while 循环中的变化不会反映在 for 循环中 i 中,所以我对相同的元素进行了多次迭代。

更改代码以避免这种情况的更好方法是什么?

【问题讨论】:

    标签: python list iteration


    【解决方案1】:

    我会这样做

    >>> mylist = [100,200,300,301,315,345,500]
    >>> [x for x in mylist if x % 100 == 0]
    [100, 200, 300, 500]
    

    编辑:仔细检查您的算法,您似乎实际上是在尝试构建一个大于前一个值加 99 的值的列表。在这种情况下,这将起作用:

    def my_filter(lst):
        ret = [lst[0]]
        for i1, i2 in zip(lst, lst[1:]):
            if i2 - i1 >= 100:
                ret.append(i2)
        return ret
    

    上面的算法是这样工作的:

    >>> my_filter([101, 202, 303, 305, 404, 505])
    [101, 202, 303, 505]
    

    【讨论】:

      【解决方案2】:

      range(len(list)) 将查看列表长度一次,然后从中创建一个范围迭代器,然后将其与列表及其长度完全分开。

      所以for i in range(len(list)) 将使i 从0 变为len(list)-1,而不考虑列表的更改。另请注意,在循环内更新迭代器变量i 根本不会影响循环本身。当下一次迭代开始时,i 将获得下一个值,无论您是否想通过之前递增 i 来跳过一次迭代。

      要跳过迭代,您通常使用continue 语句,它只会中止当前迭代并从下一个i 开始。

      就您的实际问题而言,您似乎想要过滤所有 100 的倍数的数字。您可以通过检查是否可以将其除以 100 而没有任何余数来更容易地检查单个数字。为此,您使用modulo operation,它将为您提供除法的余数。结合列表推导,您可以在其中过滤这些内容,您可以像这样简单地编写它:

      >>> lst = [100, 200, 300, 301, 315, 345, 500]
      >>> [n for n in lst if n % 100 == 0]
      [100, 200, 300, 500]
      

      还请注意,您不应将变量命名为 list,因为这会覆盖对 list 类型的引用。

      【讨论】:

      • 谢谢你的回答,但实际上我的目标有点复杂。该列表只是一个示例。抱歉,不准确,但我不想过多介绍细节并给出过于复杂的描述。我有一些滑动窗口,两个列表保留每个窗口的开始和结束位置。我想过滤掉重叠或相邻的窗口。当列表中的下一个元素与前一个非常接近时,我想遍历列表,直到找到足够远的元素,一旦找到它,我就可以从第二个列表中访问相应的元素。
      【解决方案3】:

      这是我的解决方案:

      def my_filter(xs):
          ys = []
          for x in xs:
              if (not ys) or ys[-1] + 100 <= x:
                  ys.append(x)
          return ys
      my_filter([100, 200, 300, 301, 315, 345, 500])  >> [100, 200, 300, 500]
      

      【讨论】:

      • 请注意,此算法在某些输入上产生的结果与我的不同。例如,对于输入[100, 150, 200],您的函数输出[100, 200],而我的函数输出[100]。不过,我不确定 OP 真正想要什么,因为他选择的输入和输出与这些答案中迄今为止给出的所有三种算法相匹配。
      • 谢谢您的回答。问题是,我还需要为每个元素建立索引。因此,在我的示例中,一旦我通过 301,315,345 并找到 500,我必须从另一个列表中获取相应的第 6 个元素......而且,是的,我也需要最后一个值。
      • @Malfet 您可以使用enumerate 来获取元素及其索引。
      • 我做到了!谢谢大家。我找到了一种不同的方法,但它正在工作:)
      猜你喜欢
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 2021-04-02
      相关资源
      最近更新 更多