method dict python list zip
itertools.zip_longestitertools.zip_longestitertools.zip_longest

dict - zip method in python



función similar a una cremallera que se adapta a la longitud más larga? (3)

¿Hay una función incorporada que funcione como zip() pero que rellenará los resultados de modo que la longitud de la lista resultante sea la longitud de la entrada más larga en lugar de la entrada más corta ?

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


En Python 3 puedes usar itertools.zip_longest

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

Puede rellenar con un valor diferente al None al usar el parámetro fillvalue :

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

Con Python 2 puede usar itertools.izip_longest (Python 2.6+), o puede usar map con None . Es una característica poco conocida del map (pero el map cambiado en Python 3.x, por lo que solo funciona en Python 2.x).

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



non itertools Solución 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)