Скажем, у меня есть 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 наиболее вероятен иметь метод контакта с этим.)
Что-то вроде этого?
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):
...
Используйте 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
создает список кортежей, поэтому требования к памяти могут быть большими, если самая маленькая из последовательностей довольно длинная.
Это будет зависеть от языка. У Python для этого есть довольно простой метод:
a = (0,1,2,3,4,5,6,7,8,9)
b = "ABCDEFGHIJ"
for pair in zip(a,b):
print("%d => %s" % pair)