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



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


но мне это кажется несколько неэфирным. Есть ли лучший способ сделать это?

521   7  

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

    Ничего не найдено.