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

조회수 2853회

발생하는 문제 및 실행환경

이렇게 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))로 써주세요.

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

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

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.