Имам две итерабли в 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
Един начин да го направите е да итерирате по индексите:
for i in xrange(len(foo)):
print "f: ", foo[i], "; b: ", b[i]
Но това ми се струва малко непитонично. Има ли по-добър начин да се направи това?
for f, b in zip(foo, bar):
print(f, b)
zip
спира, когато по-краткото от foo
или bar
спре.
В Python 3, zip
връща итератор на кортежи, подобно на itertools.izip
в Python2. За да получите списък
на кортежи, използвайте list(zip(foo, bar))
. И да zip, докато и двата итератора са
изчерпани, ще използвате
itertools.zip_longest.
В Python 2, zip
връща списък от кортежи. Това е добре, когато foo
и bar
не са масивни. Ако и двете са масивни, тогава формирането на 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
е изчерпан.
izip_longest
спира, когато и foo
, и bar
са изчерпани.
Когато по-краткият итератор(и) е изчерпан, izip_longest
дава кортеж с None
в позицията, съответстваща на този итератор. Ако желаете, можете да зададете и друга стойност на файла
освен None
. Вижте тук за пълната история.
Обърнете внимание също, че zip
и подобните на него zip
могат да приемат произволен брой итераби като аргументи. Например,
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
Искате функцията zip
.
for (f,b) in zip(foo, bar):
print "f: ", f ,"; b: ", b
Трябва да използвате функцията 'zip'. Ето един пример как може да изглежда вашата собствена функция zip
def custom_zip(seq1, seq2):
it1 = iter(seq1)
it2 = iter(seq2)
while True:
yield next(it1), next(it2)