迭代通过Python列表对和更新迭代

问题描述:

喜期间对我试图做出了对迭代列表中的一个代码,如果条件满足迭代通过Python列表对和更新迭代

List=[A1,A2,A4,A5,E3,A3,E1,A7,E2,E3] 

更新对,这是我迄今为止:

def pairwise(ListX): 
"Pairs -> (A1,A2), (A2,A4), (A4, A5),(A5, E3),(E3, A3),(A3, E1), ..." 
a, b = tee(ListX) 
next(b, None) 
return izip(a, b) 

for a, b in pairwise(List): 
    if a!= b and a == 'E': 
    do something and switch positions 

在这种情况下,一对(E3,A3)将被切换和新的顺序将是(A3,E3),然后将一对新的迭代将会:(E3 ,E1)而不是(A3,E1)。我到目前为止的代码使行动和切换列表的顺序:

List=[A1,A2,A4,A5,E3,A3,E1,A7,E2,E3] <--Initial 
    List=[A1,A2,A4,A5,A3,E3,E1,A7,E2,E3] <--Switched 

但交换机不断迭代对(A3,E1)。

有什么建议吗?

谢谢

您的代码不会因为itertools.tee是如何实现的工作。因为它适用于任意迭代器(不仅是序列),它需要存储由其中一个迭代器产生的值,而不是另一个迭代器产生的值。

虽然你可以解决这个问题,因为你实际上在一个列表上调用了你的pairwise函数,你可以独立迭代多次。现在

def pairwise(ListX): 
    a = iter(ListX) 
    b = iter(ListX) 
    next(b, None) 
    return izip(a, b) 

,如果修改ListX同时遍历对,更新将始终可以看到。

请注意,要有效地进行修改,您可能需要使用enumerate来获取索引以及对值。

+0

感谢您的建议。我担心效率,这是我使用itertools.tee的原因是如何高效(时间和内存)这样做? – user3671704

+0

如果有的话,我的'pairwise'版本比使用'tee'更有效率,因为你不需要队列的开销来保存一个保存的值。这两个版本的O(N)时间复杂度相同(对N个值进行迭代时)并且都只使用恒定数量的额外内存,但是我怀疑我的版本会更快一些,并且使用的内存会稍微少一些。限制是'ListX'确实需要是一个列表,而不是迭代器。 – Blckknght

+0

我还有一个问题,在这种情况下,我希望迭代从最后一对两个A(A4,A5)开始,或者从第一对(A1,A2)开始;我怎么能这样做? – user3671704

我认为没有理由使用pairwise函数,因为它是返回新对象。

l = ['A1', 'A2', 'A4', 'A5', 'E3', 'A3', 'E1', 'A7', 'E2', 'E3'] 
for i in range(len(l)-1): 
    if l[i] != l[i+1] and l[i][:1] == 'E': 
     l[i], l[i+1] = l[i+1], l[i] 
     break 
print(l) 

如果删除break下一对是( 'E3', 'E1')

+0

感谢您的建议。我担心效率(时间和内存)如何有效地完成这项工作?我的意思是你在循环中携带整数。 – user3671704

+0

@ user3671704如果您想要更改现有列表,更直接地使用列表的方式,因为当您在成对迭代循环中切换元素时,不会影响List列表对象。并且成对函数也需要一部分内存。 – DiA