2016-04-19 4 views
2

Я выгляжу так, чтобы иметь возможность повторять и параллельно по двум массивам (или только один для цикла).Как перебирать два массива параллельно?

Вот мой сценарий, я пытался ...

#!/usr/bin/env python 

list1 = [ 'one', 'two', 'three' ] 
list2 = [ 'I', 'II', 'III', 'IV', 'V' ] 

for word in list1: 
    print word + " from list1" 

for roman in list2: 
    print roman + " from list2" 

for (word, roman) in (list1 list2): 
     if word: 
       print word + " from list1" 

    if roman: 
     print roman + " from list2" 

Но, очевидно, неверно, так как я получаю ошибку синтаксиса:

File "./twoarr.py", line 12 
    for (word, roman) in (list1 list2): 
            ^
SyntaxError: invalid syntax 

Я пытаюсь получить вывод, который будет выглядеть следующим образом:

one from list1 
I from list2 
two from list1 
II from list2 
three from list1 
III from list2 
IV from list2 
V from list2 
+0

Предлагаю изменить название этого вопроса. Мне кажется, что вы не собираетесь делать это параллельно. Вы хотите сделать это в одном цикле. Название может означать другое. – Alejandro

+0

Может быть, так. Но для меня параллельность не всегда подразумевает многозадачность (разветвление, дочерние родительские процессы и т. Д.). Я имел в виду «параллельную», а не последовательную обработку массивов (один за другим). –

ответ

2

Чтобы перебрать несколько списков, вы можете использовать встроенную функцию zip. Согласно Documentation, эта функция возвращает список кортежей, где i-й кортеж содержит i-й элемент из каждой из последовательностей аргументов или итераций. Таким образом, применительно к вашему конкретному примеру

list1 = [ 'one', 'two', 'three' ] 
list2 = [ 'I', 'II', 'III', 'IV', 'V' ] 

for word in list1: 
    print word + " from list1" 

for roman in list2: 
    print roman + " from list2" 

for word, roman in zip(list1 list2): 
    print word + " from list1" 
    print roman + " from list2" 

Единственным недостатком молнии является то, что, когда ваши списки, как в этом примере, не имеют одинаковую длину, почтовый индекс возвращает список кортежей, каждый из которых имеет размерность, равную меньше один. Для того, чтобы благоприятствовать самый длинный, и заполнить None, когда это необходимо, просто заменить молнию с itertools.izip_longest:

from itertools import izip_longest 

list1 = [ 'one', 'two', 'three' ] 
list2 = [ 'I', 'II', 'III', 'IV', 'V' ] 

for word in list1: 
    print word + " from list1" 

for roman in list2: 
    print roman + " from list2" 

for word, roman in izip_longest(list1, list2): 
    print word + " from list1" 
    print roman + " from list2" 
+1

Спасибо! Это отлично работает. Всего один ничтожный придирчивый момент. Вы не указали «,» в вызове izip_longest(). Я использовал 'for word, roman в izip_longest (list1, list2):' –

+0

Да, была опечатка. Я только что исправил это. – Alejandro

5

Вы можете использовать zip для перебора более 2-х списков.

>>> list1 = [ 'one', 'two', 'three' ] 
>>> list2 = [ 'I', 'II', 'III', 'IV', 'V' ] 
>>> for (x, y) in zip(list1, list2): 
...  print x + " from list1" 
...  print y + " from list2" 
... 
one from list1 
I from list2 
two from list1 
II from list2 
three from list1 
III from list2 

Примечание: zip обеспечит до списка, который мал. Так что в вашем случае list1 имеет 3 элемента и list2 имеет 5 элементов, поэтому zip предоставит данные только для 3 элементов. Вы можете использовать izip_longest, чтобы добраться до всех элементов в list2

+4

__Примечание: __ что? – ForceBru

+0

Обновлено примечание :) – Nilesh

+1

, возможно, стоит упомянуть izip_longest от itertools, если op хочет не отрезать на более короткой длине списка https://docs.python.org/2/library/itertools.html#itertools.izip_longest –

3

У меня есть аналогичные требования, реализуемые

for i in range(len(list1)): 
    print list1[i], list2[i] 

нуждается в большем количестве обнаружения, если списки не имеют одинаковую длину, или использовать некоторые попробовать/за исключением заявления, чтобы избежать неверный индекс

1

Если вы хотите, чтобы это не просто смешать два списка, но по-настоящему работать в parallell использовании двух потоков:

import _thread 

def print_list(name, list): 
    for word in list: 
     print(word + " from " + name + "\r\n"); 

list1 = [ 'one', 'two', 'three' ] 
list2 = [ 'I', 'II', 'III', 'IV', 'V' ] 

_thread.start_new_thread(print_list, ("list1",list1)) 
_thread.start_new_thread(print_list, ("list2",list2)) 
Смежные вопросы