Python'da en uzun boyuta sahip fermuar benzeri bir fonksiyon var mı?


170

Bunun gibi çalışan zip()ancak sonuç listesinin uzunluğunun en kısa giriş yerine en uzun girişin uzunluğu olmasını sağlayacak şekilde çalışacak yerleşik bir işlev var mı?

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

Yanıtlar:


243

Python 3'te şunları kullanabilirsiniz: itertools.zip_longest

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

Aşağıdaki parametreyi Nonekullanarak farklı bir değerle dolgu yapabilirsiniz fillvalue:

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

Python 2 ile itertools.izip_longest(Python 2.6+) ya da mapile kullanabilirsiniz None. Biraz bilinen bir özelliktirmap (ancak mapPython 3.x'de değiştirilmiştir, bu yüzden bu sadece Python 2.x'te çalışır).

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

3
İtertools olmayan bir Python 3 çözümümüz yok mu?
PascalVKooten

3
@PascalvKooten gerekli değildir. itertoolszaten yerleşik bir C modülü.
Antti Haapala

82

Python 2.6x için itertoolsmodül kullanın izip_longest.

Python 3 için zip_longestbunun yerine kullanın ( satır aralığı yok i).

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

8
Kodunuzu hem python 2 hem de python 3 uyumlu yapmak istiyorsanız, six.moves.zip_longestbunun yerine kullanabilirsiniz .
Gamrix

5

itertools olmayan Python 3 çözümü:

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 çözümü:

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

0

Im 2d dizi kullanarak ama kavram python 2.x kullanarak benzer:

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
Lütfen bu kodun neden çalıştığına dair bir açıklama ekleyin. Ya da neden doğru cevap
Suit Boy Apps
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.