2016-05-16 153 views
0

喜期間對我試圖做出了對迭代列表中的一個代碼,如果條件滿足迭代通過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)。

有什麼建議嗎?

謝謝

回答

0

您的代碼不會因爲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

0

我認爲沒有理由使用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