2016-05-16 58 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がどのように実装されるかの動作しません。任意のイテレータ(シーケンスだけでなく)で動作するため、イテレータの1つでは得られた値を格納する必要がありますが、イテレータでは得られない値を格納する必要があります。

実際には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値を反復するときは)同じ 'O(N)'時間の複雑さを持ち、どちらも一定量の余分なメモリしか使用しませんが、私のバージョンは少し速くなり、制限は 'ListX'は実際にはイテレータではなくリストである必要があるということです。 – Blckknght

+0

私は、スイッチの後に、2つのAの最後のペア(A4、A5)から、または最初のペア(A1、A2)から反復を開始したい場合、別の質問があります。どうすればいい? – user3671704

0

私はそれが新しいオブジェクトを返しますので、ペアごとの機能を使用する理由はないと思います。

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) 

あなたは( 'E3'、 'E1')もbreak次のペアを削除した場合

+0

ご意見ありがとうございます。私はこのように効率的(時間と記憶)がいかに効率的であるか心配していますか?私はループ中にあなたが持ち歩いている整数を意味します。 – user3671704

+0

@ user3671704リストを直接操作する方が良い場合は、リストワイズループで要素を切り替えると 'List'オブジェクトに影響を与えないためです。また、ペアワイズ関数はメモリの一部を必要とします。 – DiA