2011-05-06 18 views
36

quiero obtener una lista de longitud fija de otra lista como:cómo rellenar una lista con 0 usando pitón

a = ['a','b','c'] 
b = [0,0,0,0,0,0,0,0,0,0] 

y quiero obtener una lista como esta: ['a','b','c',0,0,0,0,0,0,0]. En otras palabras, si len(a) < len(b), quiero llenar la lista a con los valores de la lista b hasta longitud de la lista b, algo similar a lo que hace str.ljust.

Este es mi código:

a=['a','b','c'] 
b = [0 for i in range(5)] 
b = [a[i] for i in b if a[i] else i] 

print a 

pero muestra el error:

File "c.py", line 7 
    b = [a[i] for i in b if a[i] else i] 
            ^
SyntaxError: invalid syntax 

¿qué puedo hacer?

+0

>>> b = [0 para i en el rango (10)] >>> a = ['a', 'b', 'c'] >>> b = [0 para i en el rango (10)] >>> c = [a [i] si i >> c ['a', 'b ',' c ', 0, 0, 0, 0, 0, 0, 0] – Bandiera

Respuesta

74

¿Por qué no:

a = a + [0]*(maxLen - len(a)) 
+6

Esto funciona bien para objetos inmutables (como '0') pero no funcionará para objetos mutables. '[0 for i in range (maxlen-len (a)]' funciona para objetos inmutables y mutables. –

+2

Como el cartel original pedía ceros, eso no debería ser un problema. Y su ejemplo solo funciona para objetos mutables, si asegúrate de crear uno nuevo para cada uno. Si simplemente reemplazas el 0 con otra variable, tendrás el mismo problema. – Achim

+0

@ La respuesta de S.Lott parece funcionar bien para los objetos mutables. – Roman

3

no puedes hacer:

a = ['a','b','c'] 
b = [0,0,0,0,0,0,0,0] 

c = a + b #= ['a','b','c',0,0,0,0,0,0,0] 
+0

la longitud de b es fija. – zjm1126

+0

Tener una longitud fija no es problema para concatenar listas. – recursive

+2

El resultado de su ejemplo debe ser '['a', 'b', 'c', 0, 0, 0, 0]' para que coincida con los requisitos del OP. – dansalmo

22

Uso itertools repetición.

>>> from itertools import repeat 
>>> a + list(repeat(0, 6)) 
['a', 'b', 'c', 0, 0, 0, 0, 0, 0] 
+1

No funcionará con objetos mutables. Pruebe 'lst = list (repeat ([0], 10))', luego 'lst [0] [0] = 1' y luego imprima' lst'. – naktinis

7

¿Por qué no

c = (a + b)[:len(b)] 
1

Si desea rellenar con los valores mutables, por ejemplo, con dict s:

map(lambda x: {}, [None] * n) 

Dónde n es el número de elementos de la matriz.

>>> map(lambda x: {}, [None] * 14) 
[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 
>>> l = map(lambda x: {}, [None] * 14) 
>>> l[0] 
{} 
>>> l[0]['bar'] = 'foo' 
>>> l 
[{'bar': 'foo'}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 

Poblando sin la lambda causaría que cada elemento sea {'bar': 'foo'}!

+0

'[{} para x en el rango (14)] 'logra lo mismo. – Lynn

1

Para ser más explícitos, esta solución reemplaza los primeros elementos de b con todos los elementos de a independientemente de los valores en a o b:

a + b[len(a):] 

Esto también funciona con:

>>> a = ['a', ['b'], None, False] 
>>> b = [0, 1, 2, 3, 4, 5] 
>>> a + b[len(a):] 
['a', ['b'], None, False, 4, 5] 

Si no desea que el resultado sea más largo que b:

>>> a = ['a', ['b'], None, False] 
>>> b = [0, 1, 2] 
>>> (a + b[len(a):])[:len(b)] 
['a', ['b'], None] 
0
LIST_LENGTH = 10 
a = ['a','b','c'] 

while len(a) < LIST_LENGTH: 
    a.append(0) 
+0

Esto es tan simple y explícito. No hubo lista de comprensión-fu o slice-notation-fu para entenderlo. – DevPlayer

2
a+[0]*(len(b) - len(a)) 

['a', 'b', 'c', 0, 0, 0, 0, 0, 0, 0] 
0

Sólo otra solución:

a = ['a', 'b', 'c'] 
maxlen = 10 
result = [(0 if i+1 > len(a) else a[i]) for i in range(maxlen)] 

me gustan algunas de las otras soluciones mejores.

Cuestiones relacionadas