2009-08-14 11 views
104

Gibt es eine eingebaute Funktion, die funktioniert wie zip(), aber das wird die Ergebnisse auffüllen, so dass die Länge der resultierenden Liste die Länge des längsten Eingangs ist, anstatt den kürzesten Eingang?Python: Zip-ähnliche Funktion, die auf die längste Länge puffert?

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

'itertools' ** ** ist ein eingebauter, obwohl in einem Modul. –

Antwort

137

Sie können entweder itertools.izip_longest (Python 2.6+), oder Sie können map mit None verwenden. Es ist ein wenig bekannt feature of map (aber map in Python 3.x geändert, so funktioniert dies nur in Python 2.x).

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

@SilentGhost, ich nahm dein Wort, dass dies in py3k nicht funktioniert. Ich habe keine py3k zur Bestätigung. –

+1

'> Liste (Karte (Keine, a, b, c)) Traceback (letzten Anruf zuletzt): Datei "", Zeile 1, in Liste (Karte (Keine, a, b, c)) TypeError: 'NoneType' -Objekt ist nicht aufrufbar ' – SilentGhost

+0

Sie können auch die Dokumente konsultieren: http://docs.python.org/3.1/library/functions.html#map – SilentGhost

74

Für Python 2.6x Verwendung itertools Moduls izip_longest.

Für Python 3 verwenden Sie stattdessen zip_longest (keine führende i).

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

Falls Sie Ihren Code sowohl mit Python 2 als auch mit Python 3 kompatibel machen wollen, können Sie stattdessen 'six.moves.zip_longest' verwenden. – Gamrix

2

nicht itertools Python 3 Lösung:

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)