Tengo una lista de listas tal que la longitud de cada lista interna es 1 o n (supongo n> 1).Python list transpose y fill
>>> uneven = [[1], [47, 17, 2, 3], [3], [12, 5, 75, 33]]
que desea transponer la lista, pero en lugar de truncar la lista más larga (como con zip
) o llenando las listas más cortas con None
, quiero llenar las listas más cortas con su propio valor singular. En otras palabras, me gustaría llegar:
>>> [(1, 47, 3, 12), (1, 17, 3, 5), (1, 2, 3, 75), (1, 3, 3, 33)]
que pueda hacer esto con un par de iteraciones:
>>> maxlist = len(max(*uneven, key=len))
>>> maxlist
4
>>> from itertools import repeat
>>> uneven2 = [x if len(x) == maxlist else repeat(x[0], maxlist) for x in uneven]
>>> uneven2
[[1, 1, 1, 1], [47, 17, 2, 3], [3, 3, 3, 3], [12, 5, 75, 33]]
>>> zip(*uneven2)
[(1, 47, 3, 12), (1, 17, 3, 5), (1, 2, 3, 75), (1, 3, 3, 33)]
pero ¿hay un mejor enfoque? ¿De verdad necesito saber maxlist
por adelantado para lograr esto?
Se podía simular 'itertools.izip_longest', simplemente usando el último valor de la secuencia en lugar de un' fillvalue' cuando se agota la secuencia. –
@ChrisMorgan tiene razón vio este enlace http://docs.python.org/library/itertools.html quizás también podría utilizar algunas otras funciones a partir de ahí. –