2009-08-14 9 views
104

¿Existe una función incorporada que funciona como zip() pero esa almohadilla voluntad los resultados de modo que la longitud de la lista resultante es la longitud de la entrada más larga en lugar de la de entrada más corto?Python: ¿una función tipo zip que se adapta a la longitud más larga?

>>> 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' ** ** es un built-in, a pesar de que en un módulo. –

Respuesta

137

Puede utilizar itertools.izip_longest (Python 2.6+), o puede utilizar map con None. Es un poco conocido feature of map (pero map cambió en Python 3.x, por lo que esto solo funciona en Python 2.x).

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

@SilentGhost, tomé su palabra de que esto no funciona en py3k. No tengo py3k para confirmar. –

+1

'>>> lista (mapa (Ninguna, a, b, c)) Rastreo (llamada más reciente pasado): Archivo "", línea 1, en lista (mapa (Ninguna, a, b, c)) TypeError: el objeto 'NoneType' no se puede llamar' – SilentGhost

+0

También puede consultar los documentos: http://docs.python.org/3.1/library/functions.html#map – SilentGhost

74

Para Python 2.6x uso itertools módulo de izip_longest.

Para Python 3 use zip_longest en su lugar (no lleve i).

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

En caso de que quiera hacer que su código sea compatible tanto con python 2 como con python 3, puede usar 'six.moves.zip_longest' en su lugar. – Gamrix

2

no itertools Python 3 solución:

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) 
Cuestiones relacionadas