Forma idiomática de descomprimir la lista de longitud variable de tamaño máximo n

Estoy leyendo un archivo y desempaquetando cada línea de esta manera:

for line in filter(fh): a, b, c, d = line.split() 

Sin embargo, es posible que la línea tenga más o menos columnas que las variables que deseo desempaquetar. En el caso de que haya menos, me gustaría asignar None a las variables colgantes, y en el caso de que haya más, me gustaría ignorarlas. ¿Cuál es la forma idiomática de hacer esto? Estoy usando python 2.7.

Corrija la longitud de la lista, rellenando con None .

 def fixLength(lst, length): return (lst + [None] * length)[:length] 

En primer lugar, piensa por qué quieres hacer esto.

Sin embargo, dado que desea (1) rellenar con None y (2) ignorar las variables adicionales, el código es fácil:

 a,b,c,d = (line.split() + [None]*4)[:4] 

Obviamente, el número mágico tiene que ser el mismo que el número de variables. Esto ampliará lo que tienes con el número mágico, luego recortarlo a esa longitud.

Para un iterable arbitrario puedes hacer:

 import itertools def padslice(seq,n): return itertools.islice(itertools.chain(seq,itertools.repeat(None)), n) 

Este es el mismo pad-and-slice con itertools.

En Python 3 puedes usar esto.

 a, b, c, d, *_unused_ = line.split() + [None]*4 

Editar

Para cadenas grandes, sugiero usar maxsplit -argument para dividir (este argumento también funciona en py2.7):

 a, b, c, d, *_unused_ = line.split(None, 4) + [None]*4 

¿Por qué 5? De lo contrario, el cuarto elemento consistiría en el rest de la línea.

Edit2 Es 4 … Se detiene después de 4 splits, no 4 elementos

Algo como esto, funciona para cualquier iterable / iterador. Si siempre va a pasar una lista, puede eliminar la parte islice .

 from itertools import islice def solve(seq, n): lis = list(islice(seq, n)) return lis + [None]*(n - len(lis)) ... >>> a, b, c, d = solve(range(2), 4) >>> a, b, c, d (0, 1, None, None) >>> a, b, c, d = solve('qwe', 4) >>> a, b, c, d ('q', 'w', 'e', None) >>> a, b, c, d = solve(iter([1, 2, 3, 4, 5]), 4) >>> a, b, c, d (1, 2, 3, 4)