Как перебирать два списка параллельно?
у меня есть две итерации в 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]
но мне это кажется несколько неэфирным. Есть ли лучший способ сделать это?
7 ответов:
for f, b in zip(foo, bar): print(f, b)
zipостанавливается, когда корочеfooилиbarостанавливается.на 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в позиции, соответствующей этому итератору. Вы также можете установить разныеfillvalueкроме тогоNoneесли вы хотите. Смотрите здесь для вся история.на Python 3,
zipвозвращает итератор кортежей, напримерitertools.izipв Вместо python2. Чтобы получить список кортежей, используйтеlist(zip(foo, bar)). И застегивать до тех пор, пока оба итератора не будут измученный, вы бы использовали itertools.zip_longest.
Обратите также внимание, что
zipиzip-like 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
встроенный
zipделает именно то, что вы хотите. Если вы хотите то же самое над iterables вместо списков, вы можете посмотреть на itertools.izip, который делает то же самое, но дает результаты по одному.
то, что вы ищете называется
zip.
вы должны использовать ' zip'. Вот пример того, как ваша собственная функция zip может выглядеть
def custom_zip(seq1, seq2): it1 = iter(seq1) it2 = iter(seq2) while True: yield next(it1), next(it2)
функция 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
дата3устранение:
for val1, val2 in zip(value1,value2): print (val1.text+':'+val2.text) print "\n"выход:
review1: date1
review2: date2
review3: date3
def ncustom_zip(seq1,seq2,max_length): length= len(seq1) if len(seq1)>len(seq2) else len(seq2) if max_length else len(seq1) if len(seq1)<len(seq2) else len(seq2) for i in range(length): x= seq1[i] if len(seq1)>i else None y= seq2[i] if len(seq2)>i else None yield x,y l=[12,2,3,9] p=[89,8,92,5,7] for i,j in ncustom_zip(l,p,True): print i,j for i,j in ncustom_zip(l,p,False): print i,j
Comments