Bagaimana untuk iterate melalui dua daftar di paralel?

Saya memiliki dua iterables di Python, dan aku ingin pergi atas mereka di pasang:

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

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

Ini harus menghasilkan:

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

Satu cara untuk melakukannya adalah untuk iterate atas indeks:

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

Tapi itu tampaknya agak unpythonic untuk saya. Apakah ada cara yang lebih baik untuk melakukannya?

Larutan

Python 3

for f, b in zip(foo, bar):
    print(f, b)

zip berhenti ketika lebih pendek dari foo atau bar berhenti.

Di Python 3, zip mengembalikan sebuah iterator tupel, seperti itertools.izip di Python2. Untuk mendapatkan daftar tupel, gunakan daftar(zip(foo, bar)). Dan untuk pos sampai kedua iterator adalah habis, anda akan menggunakan itertools.zip_longest.

Python 2

Di Python 2, zip mengembalikan daftar tupel. Ini adalah baik-baik saja ketika foo dan bar yang tidak besar. Jika mereka investasi besar-besaran yang kemudian membentuk zip(foo,bar) adalah tidak perlu besar-besaran sementara variabel, dan harus diganti dengan itertools.izip atau itertools.izip_longest, yang mengembalikan sebuah iterator bukan daftar.

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 berhenti ketika salah satu foo atau bar habis. izip_longest berhenti ketika kedua foo dan bar habis. Ketika lebih pendek iterator(s) telah habis, izip_longest menghasilkan tupel dengan Tidak ada di posisi yang sesuai dengan yang iterator. Anda juga dapat mengatur berbeda fillvalue selain itu Tidak jika anda ingin. Lihat disini untuk cerita.


Perhatikan juga bahwa zip dan zip-seperti brethen dapat menerima jumlah sewenang-wenang iterables sebagai argumen. Misalnya,

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

cetakan

1 red manchego
2 blue stilton
3 green brie
Komentar (9)

Anda ingin zip fungsi.

for (f,b) in zip(foo, bar):
    print "f: ", f ,"; b: ", b
Komentar (1)

Anda harus menggunakan 'zip' fungsi. Berikut adalah contoh bagaimana anda sendiri zip fungsi dapat terlihat seperti

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)
Komentar (2)

dengan python versi.

while a and b: # condition may change when length not equal
   ae, be = a.pop(0), b.pop(0) 
   print(f"{ae} {be}") # check if None
Komentar (0)

Berikut ini's bagaimana untuk melakukannya dengan daftar pemahaman:

a = (1, 2, 3)
b = (4, 5, 6)
[print('f:', i, '; b', j) for i, j in zip(a, b)]

cetakan:

f: 1 ; b 4
f: 2 ; b 5
f: 3 ; b 6
Komentar (1)