2010-07-12 4 views
11

파이썬에서 2 개의 목록을 가지고 있고 각 목록을 병렬로 반복하고 싶다고합시다. 두 목록에 대한 요소 1 일을 모두 목록에 대한 요소 2 일을 ... 나는 인덱스 사용하여이 작업을 수행 할 수 있다는 사실을 알고 :각 for 루프를 병렬로 연결하는 방법이 있습니까?

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

을하지만 더 직관적으로 할 수있는 방법이있다, foreach 루프와 함께? 뭔가가 for list1Value in list1, list2Value in list2 ...?

저는 현재 파이썬에서이 상황에 처해 있습니다. 그러나 이것은 오랫동안 의문입니다. 어떤 언어로 이것을 할 수 있는지 알고 싶습니다. (저는 방금 파이썬이 이것을 처리 할 방법이 가장 있다고 가정했습니다.)

답변

14

이런 식으로 뭔가?

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

비록 doSomething() 경우 I/O를 수행하거나 전역 상태를 업데이트하고, 그냥 한 번에 요소 중 하나에서 작동되지 않으며, 순서가 그래서 그냥 itertools에서 (chain()를 사용할 수 있습니다 중요하지 않습니다) :

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

Apropos, from itertools import *은 제가 자주하는 일입니다. 위의 zip() 대신에 izip()을 사용하십시오. izip_longest(), izip(count(), lst) 등을 살펴보십시오. 함수형 프로그래밍에 오신 것을 환영합니다. :-)

오, 또한 압축하는 것이 더 "열"로 작동합니다

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

+1 itertool.chain()에 +1! – EOL

+0

세계화가없고 체인의 적용 가능성이없는 한 예 : 'item1, item2 for zip (iter1, iter2) : fileobj.write ("% s % s \ n"% (item1, item2))' – tzot

+0

감사합니다. ! 그냥 빠른 질문 ...이 방법은 같은 길이의 목록을 필요로합니까? 그들이 그렇지 않다면 어떻게 될까요? – froadie

4

언어에 따라 달라집니다. 이것에 대한

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

사용 zip 또는 itertools.izip : 파이썬은 실제로는 오히려 간단합니다에 대한 방법이 파이썬 ≥ 3 반환 반복자에

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

파이썬 < 3 itertools.izipzip을; 즉, 요청시 쌍 (또는 3 중주, 4 중주 등)의 튜플을 제공합니다. Python 은 튜플 목록을 생성하므로 시퀀스 중 가장 작은 것이면 메모리 요구량이 클 수 있습니다.

+0

zip이 파이썬 2.6에서도 작동하는 것 같습니다. – froadie

+0

@froadie : 결코 작동하지 않는다고 말한 적이 없습니다. – tzot

관련 문제