두 목록을 동시에 반복하는 방법은 무엇입니까?


862

파이썬에는 두 개의 이터 러블이 있으며 두 쌍으로 반복하고 싶습니다.

foo = (1, 2, 3)
bar = (4, 5, 6)

for (f, b) in some_iterator(foo, bar):
    print "f: ", f, "; b: ", b

결과는 다음과 같습니다.

f: 1; b: 4
f: 2; b: 5
f: 3; b: 6

이를 수행하는 한 가지 방법은 인덱스를 반복하는 것입니다.

for i in xrange(len(foo)):
    print "f: ", foo[i], "; b: ", b[i]

그러나 그것은 나에게 다소 비현실적인 것처럼 보입니다. 더 좋은 방법이 있습니까?

답변:


1351

파이썬 3

for f, b in zip(foo, bar):
    print(f, b)

zip더 짧 foo거나 멈출 때 bar멈 춥니 다.

에서 파이썬 3 , zip 같은 튜플의 반복자 반환 itertools.izipPython2에 있습니다. 튜플 목록을 얻으려면을 사용하십시오 list(zip(foo, bar)). 두 반복자가 모두 소모 될 때까지 압축하려면 itertools.zip_longest를 사용하십시오 .

파이썬 2

에서 파이썬 2 , zip 튜플의 목록을 반환합니다. 이것은 크 foo거나 bar크지 않을 때 좋습니다. 둘 다 대규모 인 경우 형성 zip(foo,bar)은 불필요하게 대규모 임시 변수이며 itertools.izip또는 로 대체해야하며 itertools.izip_longest목록 대신 반복자를 반환합니다.

import itertools
for f,b in itertools.izip(foo,bar):
    print(f,b)
for f,b in itertools.izip_longest(foo,bar):
    print(f,b)

izipfoo또는 bar소진되면 중지합니다 . izip_longest때 모두 중지 foobar배출된다. 짧은 반복기가 소진되면 해당 반복기에 해당하는 위치에 izip_longest튜플이 생성 None됩니다. 원하는 경우 fillvalue외에 다른 것을 설정할 수도 있습니다 None. 전체 내용은 여기를 참조하십시오 .


또한 그 zipzip같은 형제들은 임의의 수의 이터 러블을 인수로 받아 들일 수 있습니다. 예를 들어

for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'], 
                              ['red', 'blue', 'green']):
    print('{} {} {}'.format(num, color, cheese))

인쇄물

1 red manchego
2 blue stilton
3 green brie

@unutbu 왜 내가 이상 OP의 방법을 선호 izip하나 (도하지만 izip/ zip훨씬 청소기 모양)?
armundle

3
아마도 미래를 대비 한 파이썬 3을 먼저 언급하고 싶을 것입니다. 또한 Python 3에서 zip ()은 itertools.izip ()만이 Python 2에 있다는 이점을 가지고 있으므로 일반적으로 갈 길입니다.
Daniel S.

3
이 함수 zipzip같은 함수가 itertools2 개가 아닌 여러 반복 가능 항목 을 허용 하도록 명시 적으로 답변하도록 업데이트 할 수 있습니까? 이 질문은 이제 정식이며 귀하의 답변은 업데이트 할 가치가있는 유일한 것입니다.
vaultah

인덱스를 추가로 원한다면 어떻게해야 i합니까? 지퍼를 열거 형으로 감쌀 수 있습니까?
Charlie Parker

2
@CharlieParker : 그렇습니다 for i, (f, b) in enumerate(zip(foo, bar)). 하지만 사용할 수 있습니다 .
unutbu

60

zip기능을 원합니다 .

for (f,b) in zip(foo, bar):
    print "f: ", f ,"; b: ", b

11
Python 3.0 이전 itertools.izip에는 많은 수의 요소가있는 경우 사용하려고합니다 .
Georg Schölly

15

' zip '기능을 사용해야 합니다. 다음은 자신의 zip 함수가 어떻게 보이는지에 대한 예입니다.

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)

이것은 정확히 같은 결과를 얻지 못합니까 zip(seq1, seq2)?
Niklas Mertsch 2018

@NiklasMertsch 예, 정확히 동일한 결과를 얻습니다. 방금 zip 함수가 어떻게 생겼는지 예를
들었습니다

0

이해력을 사용하여 n 번째 요소를 튜플 또는 목록으로 묶은 다음 생성기 함수로 전달할 수 있습니다.

def iterate_multi(*lists):
    for i in range(min(map(len,lists))):
        yield tuple(l[i] for l in lists)

for l1, l2, l3 in iterate_multi([1,2,3],[4,5,6],[7,8,9]):
    print(str(l1)+","+str(l2)+","+str(l3))

-2

누군가가 이와 같은 것을 찾고 있다면 매우 간단하고 쉽다는 것을 알았습니다.

list_1 = ["Hello", "World"]
list_2 = [1, 2, 3]

for a,b in [(list_1, list_2)]:
    for element_a in a:
        ...
    for element_b in b:
        ...

>> Hello
World
1
2
3

목록은 최소 내용 길이까지만 반복되는 zip () 과 달리 전체 내용으로 반복됩니다.


downvoters는 내 접근 방식에서 잘못된 점을 발견 하거나이 질문에 대한 가능한 해결책으로 적합하지 않은 경우 의견을 말해야합니다.
VladiC4T

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.