2011-07-25 9 views
6

Estoy intentando añadir un nuevo elemento de flotación a una lista dentro de otra lista, por ejemplo:Anexar un nuevo elemento a una lista dentro de una lista

list = [[]]*2 
list[1].append(2.5) 

Y me sale el siguiente:

print list 
[[2.5], [2.5]] 

Cuando me gustaría llegar:

[[], [2.5]] 

¿Cómo puedo hacer esto?

Gracias de antemano.

+1

Como AGF señala a continuación, lo mejor es evitar el uso de 'list' como nombre de variable, ya que normalmente es el nombre de la construcción -en tipo de lista. –

+0

A menudo, "lst" se usa para facilitar el uso. –

Respuesta

15

lst = [[] for _ in xrange(2)] (o simplemente [[], []]). No uses la multiplicación con objetos mutables: obtienes la misma X veces, no X diferentes.

+4

Yo recomendaría no usar '_' ya que aparentemente puede estropear algunos intérpretes interactivos. Además, no lo llames 'list', estás enmascarando el built-in. Además, obtendrás la misma X veces para objetos inmutables, simplemente no importa, a menos que luego quieras verificar la identidad del objeto. – agf

+4

@ag: '_' es la variable estándar" No me importa esta variable ". Es utilizado por el modo interactivo para almacenar el último resultado, pero sin duda no estropea nada. –

+0

Sé para qué se usa. Ahora lo olvido, pero creo que arruina las trazas en uno de los IDEs. – agf

2
list = [[]] 
list.append([2.5]) 

o

list = [[],[]] 
list[1].append(2.5) 
5
list_list = [[] for Null in range(2)] 

no te llaman list, que le impide llamar a la función incorporada de list().

El motivo por el cual su problema ocurre es que Python crea una lista y luego la repite dos veces. Por lo tanto, ya sea que se anexe al acceder con list_list[0] o con list_list[1], hará lo mismo para que sus cambios aparezcan en ambos índices.

1

debe escribir algo como esto:

>>> l = [[] for _ in xrange(2)] 
>>> l[1].append(2.5) 
>>> l 
[[], [2.5]] 
2

[] es un constructor de lista, y en [[]] se construye una lista y una lista secundaria. El *2 duplica la referencia a la lista interna, pero no hay nueva lista se construye:

>>> list[0] is list[1] 
... True 
>>> list[0] is [] 
... False 

La solución es tener 2 listas internas, list = [[], []]

0

Su lista Outter contiene otra lista y multiplicando la lista Outter se tener todos los elementos de la lista resultante tienen el mismo puntero a la lista interna. Puede crear una lista multidimensional de forma recursiva como esto:

def MultiDimensionalList(instance, *dimensions): 
    if len(dimensions) == 1: 
      return list(
        instance() for i in xrange(
          dimensions[0] 
        ) 
      ) 
    else: 
      return list(
        MultiDimensionalList(instance, *dimensions[1:]) for i 
        in xrange(dimensions[0]) 
      ) 

print MultiDimensionalList(lambda: None, 1, 1, 0) 

[[]]

+2

Tipo de sobre-ingeniería. –

+0

Pero le permite crear una lista de cualquier dimensión. –

+0

¡Por supuesto! Las cosas sobre-diseñadas usualmente te permiten hacer cosas "geniales", pero la mayoría no son necesarias con respecto a los requisitos iniciales ;-) –

2

Según @Cat Plus Plus no uso multiplication.I intentó sin it.With mismo código.

>> list = [[],[]] 
>> list[1].append(2.5) 
>> list 
>> [[],[2.5]] 
3

Se puede hacer en forma más sencilla ....

>>> list = [[]]*2 
>>> list[1] = [2.5] 
>>> list 
[[], [2.5]] 
Cuestiones relacionadas