繁体   English   中英

通过列表进行迭代

[英]Iteration through list with for

我是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循环中不被反射为i内for循环,所以通过相同的元件迭代多次。

避免更改代码的更好方法是什么?

这是我会做的

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

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

因此, for i in range(len(list)) i将从0转到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类型的引用。

这是我的解决方案:

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM