Как прокручивать два списка параллельно?
У меня есть два итератива в 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]
Но для меня это кажется немного неприличным. Есть ли лучший способ сделать это?
Ответы
Ответ 1
Python 3
for f, b in zip(foo, bar):
print(f, b)
zip
останавливается, когда останавливается короче foo
или bar
.
В Python 3, zip
возвращает итератор кортежей, как itertools.izip
в Python2. Чтобы получить список
кортежей, используйте list(zip(foo, bar))
. И молнии, пока оба итератора
исчерпаны, вы бы использовать
itertools.zip_longest.
Python 2
В 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
, если хотите. Смотрите здесь для полной истории.
Также обратите внимание, что zip
и его zip
-like достаточно могут принять произвольное количество повторяемых аргументов в качестве аргументов. Например,
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
Ответ 2
Вам нужна функция zip
.
for (f,b) in zip(foo, bar):
print "f: ", f ,"; b: ", b
Ответ 3
Встроенный zip
выполняет именно то, что вы хотите. Если вы хотите использовать те же самые итерации вместо списков, вы можете посмотреть на itertools.izip, который делает то же самое, но дает результаты по одному.
Ответ 4
То, что вы ищете, называется zip
.
Ответ 5
Вы должны использовать функцию " zip ". Вот пример, как может выглядеть ваша собственная функция zip.
def custom_zip(seq1, seq2):
it1 = iter(seq1)
it2 = iter(seq2)
while True:
yield next(it1), next(it2)
Ответ 6
Функция 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
обзоре3
date1
date2
date3
Решение:
for val1, val2 in zip(value1,value2):
print (val1.text+':'+val2.text)
print "\n"
Выход:
review1: date1
review2: date2
обзоре3: date3
Ответ 7
Вы можете использовать 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]
)
)
Ответ 8
с любой версией Python.
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
Ответ 9
Вот как это сделать со списком:
a = (1, 2, 3)
b = (4, 5, 6)
[print('f:', i, '; b', j) for i, j in zip(a, b)]
принтами:
f: 1 ; b 4
f: 2 ; b 5
f: 3 ; b 6
Ответ 10
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