파이썬에서 가장 긴 길이로 채워지는 zip 같은 함수가 있습니까?


170

작동 zip()하지만 결과 목록의 길이가 가장 짧은 입력이 아닌 가장 긴 입력 의 길이가되도록 결과를 채우는 내장 함수가 있습니까?

>>> a = ['a1']
>>> b = ['b1', 'b2', 'b3']
>>> c = ['c1', 'c2']

>>> zip(a, b, c)
[('a1', 'b1', 'c1')]

>>> What command goes here?
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]

답변:


243

파이썬 3에서는 사용할 수 있습니다 itertools.zip_longest

>>> list(itertools.zip_longest(a, b, c))
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]

매개 변수 None를 사용하여 와 다른 값으로 채울 수 있습니다 fillvalue.

>>> list(itertools.zip_longest(a, b, c, fillvalue='foo'))
[('a1', 'b1', 'c1'), ('foo', 'b2', 'c2'), ('foo', 'b3', 'foo')]

파이썬이 사용하면 중 하나를 사용할 수 있습니다 itertools.izip_longest(파이썬 2.6+)하거나 사용할 수 있습니다 mapNone. 약간 알려진 기능map 이지만 mapPython 3.x에서 변경되었으므로 Python 2.x에서만 작동합니다.

>>> map(None, a, b, c)
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]

3
itertools가 아닌 Python 3 솔루션이 없습니까?
PascalVKooten

3
@PascalvKooten 필요하지 않습니다. itertools어쨌든 내장 C 모듈입니다.
Antti Haapala

82

Python 2.6x의 경우 itertoolsmodule을 사용하십시오 izip_longest.

파이썬 3의 경우 zip_longest대신에 선행을 사용 i하십시오.

>>> list(itertools.izip_longest(a, b, c))
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]

8
python 2와 python 3 코드를 호환 가능하게하려면 six.moves.zip_longest대신 사용할 수 있습니다 .
Gamrix

5

itertools가 아닌 Python 3 솔루션 :

def zip_longest(*lists):
    def g(l):
        for item in l:
            yield item
        while True:
            yield None
    gens = [g(l) for l in lists]    
    for _ in range(max(map(len, lists))):
        yield tuple(next(g) for g in gens)

2

itertools가 아닌 My Python 2 솔루션 :

if len(list1) < len(list2):
    list1.extend([None] * (len(list2) - len(list1)))
else:
    list2.extend([None] * (len(list1) - len(list2)))

0

2d 배열을 사용하고 있지만 파이썬 2.x를 사용하는 개념은 비슷합니다.

if len(set([len(p) for p in printer])) > 1:
    printer = [column+['']*(max([len(p) for p in printer])-len(column)) for column in printer]

2
이 코드가 작동하는 이유에 대한 설명을 추가하십시오. 또는 왜 정답
Suit Boy Apps
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.