2009-11-02 3 views
478

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

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

ответ

769
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, если хотите. См. Здесь full story.

В Python 3, zip возвращает итератор кортежей, как itertools.izip в python2. Чтобы получить список кортежей, используйте list(zip(foo, bar)). И чтобы застегнуть молнию до тех пор, пока оба итератора не будут исчерпаны, вы должны использовать itertools.zip_longest.


Отметим также, что zip и его zip -как 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 
+3

@unutbu В Python 3 имя функции - 'itertools.zip_longest', вместо' itertools.izip_longest' (в основном 'zip ...' вместо 'izip ...' в модуле 'itertools'). Это редактирование одного персонажа, иначе я бы отредактировал супер незначительную коррекцию в вашем ответе. –

+1

@MichaelA: Спасибо за исправление. – unutbu

+0

@unutbu Почему я предпочитаю метод OP над 'izip' (даже если' izip'/'zip' выглядит намного чище)? – armundle

33

Вы хотите функцию zip.

for (f,b) in zip(foo, bar): 
    print "f: ", f ,"; b: ", b 
+8

Перед Python 3.0 вы хотели бы использовать 'itertools.izip', если у вас есть большое количество элементов. –

9

То, что вы ищете, называется zip.

11

Встроенный zip делает именно то, что вы хотите. Если вы хотите использовать те же самые итерации вместо списков, вы можете посмотреть на itertools.izip, который делает то же самое, но дает результаты по одному.

2

почтовый функция решает проблему
Документам: ZIP Library function

Цель: поставить выходной бок о бок Проблема:

#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
review3: date3

4

Вы должны использовать функцию 'zip'. Вот пример того, как ваша собственная функция почтового индекса может выглядеть

def custom_zip(seq1, seq2): 
    it1 = iter(seq1) 
    it2 = iter(seq2) 
    while True: 
     yield next(it1), next(it2) 
-1
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 
+1

Хотели бы вы помочь бороться с неправильным представлением о том, что StackOveflow - бесплатная служба кодирования? Тогда, пожалуйста, увеличьте свой код только ответ с некоторыми объяснениями. – Yunnosch

+0

это мой ответ? –

+0

что не так в моем ответе.? –

Смежные вопросы