5

この質問は、2 つの python ループを同時に実行するにはどうすればよいですか?に密接に関連しています。

より明確に言えば、上記のリンクで質問者が尋ねていることを取得します。

for i in [1,2,3], j in [3,2,1]:
    print i,j
    cmp(i,j) #do_something(i,j)

しかし

L1: [1,2,3] の i と [3,2,1] の j の場合: 動作しません

Q1. しかし、ここで起こったことは面白いものでした:

    for i in [1,2,3], j in [3,2,1]:
    print i,j


[1, 2, 3] 0
False 0

Q2. L1 のようなものを機能させるにはどうすればよいですか?

マルチスレッドや並列処理ではありません。(ループ内のループではなく、2 つの同時タスクです)、2 つの結果を比較します。

ここでは、リストは数字でした。私のケースは数字ではありません:

for i in f_iterate1() and j in f_iterate2():

更新: 以下の abarnert は正しかったです。j をどこかで定義しました。したがって、次のようになります。

>>> for i in [1,2,3], j in [3,2,1]:
    print i,j



Traceback (most recent call last):
  File "<pyshell#142>", line 1, in <module>
    for i in [1,2,3], j in [3,2,1]:
NameError: name 'j' is not defined

そして、2 つの反復関数を圧縮するつもりはありません。ただし、for ループのような状況でそれらを同時に処理します。問題は、Pythonでどのように達成できるかということです。

更新 #2: 同じ長さのリストで解決

>>> def a(num):
    for x in num:
        yield x


>>> n1=[1,2,3,4]
>>> n2=[3,4,5,6]
>>> x1=a(n1)
>>> x2=a(n2)
>>> for i,j in zip(x1,x2):
    print i,j


1 3
2 4
3 5
4 6
>>> 

【解決済み】

Q3. n3=[3,4,5,6,7,8,78,34] で、n1,n2 の両方より大きい場合はどうでしょうか。zip はここでは機能しません。izip_longest のようなものですか? izip_longest は十分に機能します。

4

3 に答える 3

10

あなたが何を求めているのか理解するのは難しいですが、あなたはただ欲しいと思いますzip:

for i, j in zip([1,2,3], [3,2,1]):
    print i, j

for i, j in zip(f_iterate1(), f_iterate2()):
    print i, j

など…</p>

この用語が通常使用されているため、これは同時に何もしません。一度に 1 つのことを行うだけですが、その 1 つは「ロックステップで 2 つのシーケンスを繰り返す」ことです。


これは明らかな方法で 3 つ以上のリストに拡張されることに注意してください。

for i, j, k in zip([1,2,3], [3,2,1], [13, 22, 31]):
    print i, j, k

(リストの数がわからない場合は、コメントを参照してください。)


これで何が起こっているのか疑問に思っている場合:

for i in [1,2,3], j in [3,2,1]:
    print i,j

これを試して:

print [1,2,3], j in [3,2,1]

jすでにどこかで定義している場合は、 または のいずれ[1, 2, 3] Falseかが出力されます[1, 2, 3] True。それ以外の場合は、NameError. これは、2 つの値のタプルを作成しているだけだからです。1 つ目は list[1,2,3]で、2 つ目は expression の結果ですj in [3,2,1]

そう:

j=0
for i in [1,2,3], j in [3,2 1]:
    print i, j

…は次と同等です:

j=0
for i in ([1,2,3], False):
    print i, 0

…出力されます:

[1, 2, 3] 0
False 0
于 2013-05-14T20:49:21.933 に答える
5

zip()関数を使用したい:

for i, j in zip([1, 2, 3], [3, 2, 1]):
    #

for i, j in zip(f_iterate1(), f_iterate2()):
    #

zip()入力リストの要素をペアにして、一緒に処理できるようにします。

入力が大きい場合やイテレータの場合はfuture_builtins.zip()、またはを使用します。Python 3 との上位互換性を気にしない場合は、itertools.izip()代わりに;を使用してください。これらは、出力リスト全体を一度に作成する代わりに、オンデマンドでペアを生成します。

from future_builtins import zip

for i, j in zip(f_iterate1(), f_iterate2()):

ジェネレーターはこのシナリオに該当します。

最後になりましたが、入力リストの長さが異なるzip()場合、最短のリストがなくなると停止します。代わりに最長のリストを続行する場合は、 itertools.izip_longest();を使用します。短い入力シーケンスが使い果たされると、フィル値が使用されます。

>>> for i, j, k in izip_longest(range(3), range(3, 5), range(5, 10), fillvalue=42):
...     print i, j, k
... 
0 3 5
1 4 6
2 42 7
42 42 8
42 42 9

のデフォルトはfillvalueですNone


あなたの試み:

for i in [1,2,3], j in [3,2,1]:

実際には次のように解釈されます。

for i in ([1,2,3], j in [3,2,1]):

ここで、後半部分は 2 つの値を持つタプルとして解釈されます。1 つはリスト、もう 1 つはブール値です。テスト後j in [3,2,1]、 は または のいずれTrueFalseです。前のループ実験からjとして定義したので、です。00 in [3, 2, 1]False

于 2013-05-14T20:49:18.957 に答える