Как прокручивать два списка параллельно?

У меня есть два итератива в 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