여러 개 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]
  • 2016년 01월 27일에 작성됨

조회수 195


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

  • 2016년 01월 27일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close