web-dev-qa-db-ja.com

2つのリストを並列に処理する方法

私はPythonに二つのイテラブルを持っています、そしてそれらをペアで調べたいのです。

foo = (1, 2, 3)
bar = (4, 5, 6)

for (f, b) in some_iterator(foo, bar):
    print "f: ", f, "; b: ", b

結果は以下のようになります。

f: 1; b: 4
f: 2; b: 5
f: 3; b: 6

1つの 方法は、インデックスを反復することです。

for i in xrange(len(foo)):
    print "f: ", foo[i], "; b: ", b[i]

しかし、それは私にとってはやや気味が悪いようです。もっと良い方法はありますか?

695
Nathan Fellman
for f, b in Zip(foo, bar):
    print(f, b)

Zipまたはfooの短い方が停止すると、barは停止します。

In Python 2 Zip はタプルのリストを返します。 foobarが大規模でない場合はこれで問題ありません。両方とも大規模な場合、Zip(foo,bar)の形成は不必要に大規模な一時変数であり、リストの代わりにイテレーターを返すitertools.izipまたはitertools.izip_longestに置き換える必要があります。

import itertools
for f,b in itertools.izip(foo,bar):
    print(f,b)
for f,b in itertools.izip_longest(foo,bar):
    print(f,b)

izipまたはfooが使い果たされると、barは停止します。 foobarの両方が使い果たされるとizip_longestは停止します。短い方の反復子が使い果たされると、izip_longestは、その反復子に対応する位置にNoneを持つTupleを生成します。必要に応じて、fillvalue以外に別のNoneを設定することもできます。 全文 についてはこちらをご覧ください。

In Python 3 Zip はPython2のitertools.izipのようにタプルのイテレータを返します。タプルのリストを取得するにはlist(Zip(foo, bar))を使います。そして両方のイテレータが使い尽くされるまでZipするには、 itertools.Zip_longest を使用します。


ZipとそのZipのようなbrethenは引数として任意の数のイテラブルを受け取ることができることにも注意してください。例えば、

for num, cheese, color in Zip([1,2,3], ['manchego', 'stilton', 'brie'], 
                              ['red', 'blue', 'green']):
    print('{} {} {}'.format(num, color, cheese))

版画

1 red manchego
2 blue stilton
3 green brie
1084
unutbu

Zip関数が欲しいです。

for (f,b) in Zip(foo, bar):
    print "f: ", f ,"; b: ", b
47
Karl Guertin

組み込みのZipはまさにあなたが望むことをします。リストの代わりにイテラブルに対して同じものを使いたいのなら、itertools.izipを見てください。

14
robince

お探しのものは Zip です。

12
Alex Martelli

あなたは ' Zip '関数を使うべきです。これはあなた自身のZip関数がどのように見えるかの例です。

def custom_Zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)
6
Vlad Bezden

Zip機能が問題を解決
ドキュメント: Zipライブラリ関数

目的:出力を並べて配置すること問題:

#value1 is a list
value1 = driver.find_elements_by_class_name("review-text")
#value2 is a list
value2 = driver.find_elements_by_class_name("review-date")

for val1 in value1:
    print(val1.text)
    print "\n"
for val2 in value2:
    print(val2.text)
    print "\n"

出力:
review1
review2
review3
date1
date2
date3

溶液:

for val1, val2 in Zip(value1,value2):
    print (val1.text+':'+val2.text)
    print "\n"

出力:
review1:date1
review2:date2
review3:date3

5
Mono

1つの辞書で3つのタイプを使うことができます:

def construct_dictionary_from_lists(names, ages, scores):
     end_str_dic = {}
     for item_name, item_age, score_item in Zip(names, ages, scores):
         end_str_dic[item_name] = item_age, score_item
     return end_str_dic


print(
        construct_dictionary_from_lists(
            ["paul", "saul", "steve", "chimpy"],
            [28, 59, 22, 5], 
            [59, 85, 55, 60]
         )
      )
0
shervin hariri