2010-07-12 65 views
11

假設我在Python中有2個列表,並且我想並行地遍歷每個列表 - 例如,做件1東西兩個列表,兩個列表做件2東西...我知道我可以使用索引做到這一點:有沒有一種方法可以並行處理每個循環?

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

但是,有沒有辦法更直觀地做到這一點,用foreach循環?像for list1Value in list1, list2Value in list2 ...?

我目前在Python中遇到了這種情況,但這是一個長期存在的問題,我很想知道你是否可以用任何語言來做到這一點。 (我只是假定Python是最有可能處理這個問題的方法的。)

回答

14

這樣的事情?

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

但如果doSomething()沒有做I/O或更新的全局狀態,它只是工程上的元素之一的時間,順序並不重要,所以你可以只使用chain()(從itertools ):

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

Apropos,from itertools import *是我經常做的事。考慮izip()而不是使用上面給出的zip()。也看看izip_longest()izip(count(), lst)等歡迎使用函數式編程。 :-)

哦,還有荏苒更多的 「列」 的工作原理:

for idx, a, b, c in izip(count(), A, B, C): 
    ... 
+0

+1''itertool.chain()'! – EOL 2010-07-12 16:14:24

+0

一個沒有整體性和鏈適用性的例子:'item1,item2 in zip(iter1,iter2):fileobj.write(「%s%s \ n」%(item1,item2))' – tzot 2010-07-12 16:32:07

+0

感謝這很棒!只是一個簡單的問題......這種方法要求列表的長度相同嗎?如果他們不是,會發生什麼? – froadie 2010-07-12 16:42:24

4

這將取決於語言。 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

使用zipitertools.izip此:

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

在Python 和zip在Python≥3個迭代器;即它們根據請求提供對的元組(或者三元組,四元組等)。 Python 創建元組列表,因此如果最小的序列很長,則內存需求可能會很大。

+0

zip似乎在Python 2.6以及 – froadie 2010-07-12 16:41:11

+0

@froadie:我從來沒有說過它不工作。 – tzot 2010-07-12 16:44:12

相關問題