2012-01-03 90 views
35

我生气的列表索引,并不能解释我做错了什么。将项目附加到列表中的Python列表

我有这样一段代码,其中我想创建列表的列表,每一个包含相同的电路参数(电压,电流等)我是从一个文件csv看起来像读取的值这个:

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

依此类推。我想是创建,例如包含V1和I1名单(我要以交互方式选择)的形式[V1],[I1],所以:

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

是我的代码基于M是这样的:

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是一个包含所有值的列表,而positions是,我想从.csv文件复制列的索引列表。问题是,如果我在shell中尝试命令,似乎工作,但如果我运行脚本而不是将每个值附加到正确的子列表,它将所有值附加到所有列表,所以我获得2(或更多)相同的名单。

回答

72

Python的列表是可变的对象,在这里:

plot_data = [[]] * len(positions) 

你重复相同的列表len(positions)倍。

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

列表中的每个列表都是对同一对象的引用。你修改一个,你会看到所有这些修改。

如果你想不同的列表,你可以这样说:

plot_data = [[] for _ in positions] 

例如:

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

真棒!正是我在寻找 – Jay 2014-08-13 03:29:40

+1

有人对下划线黑魔法有很好的解释吗?我相信它被用作[一次性变量](http://stackoverflow.com/questions/5893163/what-is-the-purpose-of-the-single-underscore-variable-in-python),但我仍然不会不太明白这意味着什么。 – 2015-07-28 02:27:05

+0

@AustinA你在链接的SO问题中从你选择的答案中无法理解什么? – joaquin 2015-07-29 08:06:58

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

没错,但是我需要选择dinamically打印多少个以及要打印哪一组值......可以像许多一样...... – clabacchio 2012-01-03 14:26:30

+0

@clabacchio - 更新了我的答案。现在它可以处理任何列的顺序。 – eumiro 2012-01-03 14:29:59