Есть ли способ иметь параллельные для каждого цикла? - PullRequest
11 голосов
/ 12 июля 2010

Допустим, у меня есть два списка в Python, и я хочу циклически проходить через каждый из них - например, сделать что-то с элементом 1 для обоих списков, сделать что-то с элементом 2 для обоих списков ... Я знаю, что могу сделать этоиспользуя индекс:

for listIndex in range(len(list1)):
   doSomething(list1[listIndex])
   doSomething(list2[listIndex])

Но есть ли способ сделать это более интуитивно, с циклом foreach?Что-то вроде for list1Value in list1, list2Value in list2 ...?

В настоящий момент я сталкиваюсь с такой ситуацией в Python, но это давний вопрос, и мне было бы интересно узнать, можете ли вы сделать это на любом языке.(Я просто предположил, что Python, скорее всего, имеет метод борьбы с этим.)

Ответы [ 3 ]

14 голосов
/ 12 июля 2010

Что-то вроде этого?

for (a,b) in zip(list1, list2):
  doSomething(a)
  doSomething(b)

Хотя, если doSomething() не выполняет ввод-вывод или не обновляет глобальное состояние, а одновременно работает только с одним из элементов, порядокНеважно, чтобы вы могли просто использовать chain() (из itertools):

for x in chain(list1, list2):
  doSomething(x)

Кстати, from itertools import * - это то, что я делаю очень часто.Рассмотрим izip() вместо использования zip(), которое я дал выше.Также посмотрите на izip_longest(), izip(count(), lst) и т. Д. Добро пожаловать в функциональное программирование.: -)

О, и архивирование также работает с большим количеством «столбцов»:

for idx, a, b, c in izip(count(), A, B, C):
  ...
4 голосов
/ 12 июля 2010

Используйте zip или itertools.izip для этого:

for item1, item2 in zip(iterable1, iterable2):
    # process the items in parallel

itertools.izip в Python <3 и <code>zip в Python ≥ 3 возвращают итераторы; то есть они предоставляют по запросу наборы пар (или тройки, квартеты и т. д.). Python <3 <code>zip создает список кортежей, поэтому требования к памяти могут быть большими, если наименьшая из последовательностей достаточно длинная.

4 голосов
/ 12 июля 2010

Это будет зависеть от языка. У Python есть довольно простой метод для этого:

a = (0,1,2,3,4,5,6,7,8,9)
b = "ABCDEFGHIJ"
for pair in zip(a,b):
  print("%d => %s" % pair)
...