여러 개 iterable을 동시에 이터레이트 하려면?

발생하는 문제 및 실행환경

이렇게 iterable 2개가 있을 때, 각각 원소를 짝지어서

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]

1답변

  • 좋아요

    0

    싫어요
    채택취소하기
    for f, b in zip(foo, bar):
        print(f, b)
    

    으로 쓰는 경우, foobar 중 더 길이가 작은 iterable을 기준으로 반복문이 끝납니다.

    python2에서 zip()은 tuple을 저장하는 리스트를 return합니다. 때문에 foobar이 너무 큰 경우는, 너무 큰 임시 객체가 만들어져 비효율적이니 이 때는 zip을 itertools.izip이나 itertools.izip_longest으로 바꿔서 list가 아닌 iterator로 써주세요.

    예제 :

    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)
    

    itertools.izip()을 쓰면 foobar 중 더 길이가 짧은 iterable을 기준으로 반복문이 종료됩니다. itertools.izip_longest()를 쓰면 foobar 중 더 길이가 긴 iterable을 기준으로 반복문이 종료됩니다. 이 때 한쪽이 더 짧은 경우는 tuple의 원소에 None이 들어갑니다.

    python3에서 zip()은 python2의 itertools.izip처럼 tuple의 이터레이터를 return합니다. python2의 zip()처럼 리스트를 받고 싶다면 list(zip(foo, bar))로 써주세요.

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.