여러 개 iterable을 동시에 이터레이트 하려면?
조회수 5967회
발생하는 문제 및 실행환경
이렇게 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 답변
-
for f, b in zip(foo, bar): print(f, b)
으로 쓰는 경우,
foo
나bar
중 더 길이가 작은 iterable을 기준으로 반복문이 끝납니다.python2에서
zip()
은 tuple을 저장하는 리스트를 return합니다. 때문에foo
와bar
이 너무 큰 경우는, 너무 큰 임시 객체가 만들어져 비효율적이니 이 때는 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()
을 쓰면foo
와bar
중 더 길이가 짧은 iterable을 기준으로 반복문이 종료됩니다.itertools.izip_longest()
를 쓰면foo
와bar
중 더 길이가 긴 iterable을 기준으로 반복문이 종료됩니다. 이 때 한쪽이 더 짧은 경우는 tuple의 원소에 None이 들어갑니다.python3에서
zip()
은 python2의itertools.izip
처럼 tuple의 이터레이터를 return합니다. python2의zip()
처럼 리스트를 받고 싶다면list(zip(foo, bar))
로 써주세요.
댓글 입력