0

我是 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]

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

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

4

3 回答 3

5

这是我的做法

>>> 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]
于 2013-05-08T11:25:18.287 回答
1

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

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

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

关于您的实际问题,您似乎想要过滤所有 100 的倍数的数字。您可以通过检查是否可以将其除以 100 而没有任何余数来更容易地检查单个数字。为此,您使用模运算,它将为您提供除法的余数。结合您过滤这些的列表理解,您可以像这样简单地编写它:

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

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

于 2013-05-08T11:36:16.587 回答
0

这是我的解决方案:

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]
于 2013-05-08T11:59:40.653 回答