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


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


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

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
이 함수 zip와 zip같은 함수가 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.