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)]
Para Python itertools
use el módulo izip_longest
''s izip_longest
.
Para Python 3 use itertools.zip_longest en itertools.zip_longest lugar (sin dirección i
).
>>> list(itertools.izip_longest(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)