Существует ли способ иметь параллельные циклы foreach?

Скажем, у меня есть 2 списка в 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 наиболее вероятен иметь метод контакта с этим.)

11
задан SilentGhost 12 July 2010 в 18:33
поделиться

3 ответа

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

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):
  ...
14
ответ дан 3 December 2019 в 05:11
поделиться

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

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

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

4
ответ дан 3 December 2019 в 05:11
поделиться

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

a = (0,1,2,3,4,5,6,7,8,9)
b = "ABCDEFGHIJ"
for pair in zip(a,b):
  print("%d => %s" % pair)
4
ответ дан 3 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: