2013-05-08 187 views
0

我是一个Python新手。 想象一下,我有一个列表[100, 200, 300, 301, 315, 345, 500]。我想创建一个新的列表,如[100, 200, 300, 500]迭代通过列表与

当我遍历列表等认为:i内的while循环不会反映为内for循环i

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

然后变化,所以通过相同的元件迭代多次。

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

回答

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

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

所以for i in range(len(list))将使i0len(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类型。

+0

谢谢你的回答,但其实我的目的是更复杂一点。该清单只是一个例子。对不起,因为没有准备,但我不想过分细节并给出太复杂的描述。我有一些滑动窗口和两个列表保持每个窗口的开始和结束位置。我想过滤出重叠或相邻的窗口。当列表中的下一个元素非常接近前一个元素时,我想遍历列表直到找到足够远的元素,只要我找到它,就可以从第二个列表中访问相应的元素。 – Malfet 2013-05-08 15:20:34

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

请注意,该算法在某些输入上产生与我的结果不同的结果。例如,对于输入'[100,150,200]',你的函数输出'[100,200]',而我的产生'[100]''。我不确定OP真正需要的是什么,因为他选择的输入和输出都与这些答案中给出的所有三种算法相匹配。 – 2013-05-08 12:19:28

+0

谢谢你的回答。事情是,我需要然后还索引每个元素。所以,在我的例子中,一旦我经历了301,315,345并找到500,我必须从另一个列表中获得相应的第六个元素......并且,是的,我确实需要最后一个值。 – Malfet 2013-05-08 15:25:34

+0

@Malfet你可以使用'enumerate'来获取元素及其索引。 – poke 2013-05-08 15:33:20