개발관련/other

두개의 list를 병렬로 반복하는 방법

Rateye 2021. 11. 1. 10:20
728x90
반응형
질문 : 두 목록을 병렬로 반복하는 방법은 무엇입니까?

파이썬에 두 개의 반복 가능 항목이 있으며 쌍으로 살펴보고 싶습니다.

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 range(len(foo)):
    print("f: ", foo[i], "; b: ", bar[i])

그러나 그것은 나에게 다소 비정상적인 것처럼 보입니다. 더 나은 방법이 있습니까?

답변

Python 3

for f, b in zip(foo, bar):
    print(f, b)

foo 또는 bar 가 중지되면 zip 이 중지됩니다.

Python 3 에서 zip 은 Python2의 itertools.izip 과 같은 튜플의 반복자를 반환합니다. 튜플 목록을 얻으려면 list(zip(foo, bar)) . 두 반복자가 모두 소진 될 때까지 압축하려면itertools.zip_longest를 사용합니다.

 

Python 2

Python 2 에서 zip 은 튜플 목록을 반환합니다. foobar 가 방대하지 않을 때 괜찮습니다. 둘 다 방대한 경우 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)

foo 또는 bar 가 모두 소진 izip 이 중지됩니다. izip_longest foobar 가 모두 소진되면 중지됩니다. 더 짧은 반복기가 소진되면 izip_longest 는 해당 반복기에 해당하는 위치에 None 있는 튜플을 생성합니다. 원하는 경우 None 외에 fillvalue 값을 설정할 수도 있습니다. 전체 내용은 여기를 참조하십시오.


또한 zipzip 과 유사한 brethen은 임의의 수의 iterable을 인수로 허용 할 수 있습니다. 예를 들면

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
출처 : https://stackoverflow.com/questions/1663807/how-to-iterate-through-two-lists-in-parallel
728x90
반응형