[python] 두 목록을 동시에 반복하는 방법은 무엇입니까?

파이썬에는 두 개의 이터 러블이 있으며 두 쌍으로 반복하고 싶습니다.

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]

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



답변

파이썬 3

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

zip더 짧 foo거나 멈출 때 bar멈 춥니 다.

에서 파이썬 3 , zip
같은 튜플의 반복자 반환 itertools.izipPython2에 있습니다. 튜플 목록을 얻으려면을 사용하십시오 list(zip(foo, bar)). 두 반복자가 모두 소모 될 때까지 압축하려면 itertools.zip_longest를 사용하십시오
.

파이썬 2

에서 파이썬 2 , zip
튜플의 목록을 반환합니다. 이것은 크 foo거나 bar크지 않을 때 좋습니다. 둘 다 대규모 인 경우 형성 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)

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


또한 그 zipzip같은 형제들은 임의의 수의 이터 러블을 인수로 받아 들일 수 있습니다. 예를 들어

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


답변

zip기능을 원합니다 .

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


답변

zip ‘기능을 사용해야 합니다. 다음은 자신의 zip 함수가 어떻게 보이는지에 대한 예입니다.

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)


답변

이해력을 사용하여 n 번째 요소를 튜플 또는 목록으로 묶은 다음 생성기 함수로 전달할 수 있습니다.

def iterate_multi(*lists):
    for i in range(min(map(len,lists))):
        yield tuple(l[i] for l in lists)

for l1, l2, l3 in iterate_multi([1,2,3],[4,5,6],[7,8,9]):
    print(str(l1)+","+str(l2)+","+str(l3))


답변

누군가가 이와 같은 것을 찾고 있다면 매우 간단하고 쉽다는 것을 알았습니다.

list_1 = ["Hello", "World"]
list_2 = [1, 2, 3]

for a,b in [(list_1, list_2)]:
    for element_a in a:
        ...
    for element_b in b:
        ...

>> Hello
World
1
2
3

목록은 최소 내용 길이까지만 반복되는 zip () 과 달리 전체 내용으로 반복됩니다.


답변

다음은 목록 이해를 통해 수행하는 방법입니다.

a = (1, 2, 3)
b = (4, 5, 6)
[print('f:', i, '; b', j) for i, j in zip(a, b)]

인쇄물:

f: 1 ; b 4
f: 2 ; b 5
f: 3 ; b 6


답변