2012-01-03 20 views
35

Me estoy volviendo loco con índices de listas, y no puedo explicar lo que estoy haciendo mal.Agregar elementos a una lista de listas en python

Tengo este código en el que quiero crear una lista de listas, cada una de las cuales contiene valores del mismo parámetro de circuito (voltaje, corriente, etc.) que estoy leyendo de un archivo csv que se parece a esto:

Sample, V1, I1, V2, I2 
0, 3, 0.01, 3, 0.02 
1, 3, 0.01, 3, 0.03 

Y así sucesivamente. Lo que quiero es crear una lista que contiene, por ejemplo V1 e I1 (pero quiero elegir de forma interactiva) en forma [[V1], [I1]], así:

[[3,3], [0.01, 0.01]] 

El código que yo' estoy usando es la siguiente:

plot_data = [[]]*len(positions)  
for row in reader: 
    for place in range(len(positions)): 
     value = float(row[positions[place]]) 
     plot_data[place].append(value) 

plot_data es la lista que contiene todos los valores, mientras que positions es una lista con los índices de las columnas que desea copiar desde el archivo .csv. El problema es que si pruebo los comandos en el shell, parece que funciona, pero si ejecuto el script en lugar de agregar cada valor a la lista correcta, agrega todos los valores a todas las listas, así que obtengo 2 (o más)) listas idénticas.

Respuesta

72

listas de Python son objetos mutables y aquí:

plot_data = [[]] * len(positions) 

estás repitiendo la misma lista len(positions) veces.

>>> plot_data = [[]] * 3 
>>> plot_data 
[[], [], []] 
>>> plot_data[0].append(1) 
>>> plot_data 
[[1], [1], [1]] 
>>> 

Cada lista en la lista es una referencia al mismo objeto. Usted modifica uno, ve la modificación en todos ellos.

Si quiere diversas listas, puede hacerlo de esta manera:

plot_data = [[] for _ in positions] 

por ejemplo:

>>> pd = [[] for _ in range(3)] 
>>> pd 
[[], [], []] 
>>> pd[0].append(1) 
>>> pd 
[[1], [], []] 
+0

impresionante! Justo lo que estaba buscando – Jay

+1

¿Alguien tiene una buena explicación del guión bajo de magia negra? Creo que se está utilizando como [variable de usar y tirar] (http://stackoverflow.com/questions/5893163/what-is-the-purpose-of-the-single-underscore-variable-in-python) pero sigo sin usar No entiendo lo que eso significa. –

+0

@AustinA ¿qué es exactamente lo que no entiendes de la respuesta seleccionada en la pregunta SO que enlazas? – joaquin

2
import csv 
cols = [' V1', ' I1'] # define your columns here, check the spaces! 
data = [[] for col in cols] # this creates a list of **different** lists, not a list of pointers to the same list like you did in [[]]*len(positions) 
with open('data.csv', 'r') as f: 
    for rec in csv.DictReader(f): 
     for l, col in zip(data, cols): 
      l.append(float(rec[col])) 
print data 

# [[3.0, 3.0], [0.01, 0.01]] 
+0

correcto, pero tengo que elegir dinámicamente cuántos y qué conjuntos de valores imprimir ... puede ser uno como tantos ... – clabacchio

+0

@clabacchio - actualicé mi respuesta. Ahora funciona con cualquier orden de columnas. – eumiro

Cuestiones relacionadas