Pythonで最長の長さにパディングする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

Python 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')]

Pythonの2を使用すると、いずれかを使用することができますitertools.izip_longest(パイソンを2.6+)、またはあなたが使用することができますmapNone。これはあまり知られていない機能ですmap(ただしmap、Python 3.xで変更されたため、これはPython 2.xでのみ機能します)。

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

3
itertools以外のPython 3ソリューションはありませんか?
PascalVKooten 2015年

3
@PascalvKooten必須ではありません。itertoolsとにかく組み込みのCモジュールです。
Antti Haapala 2017

82

Python 2.6xの場合、itertoolsモジュールのを使用しますizip_longest

Python 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配列を使用していますが、Python 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.