附加项目列表在Python中的列表

我生气的列表索引,并不能解释我做错了什么。

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

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

等等。 我想要的是以[[V1],[I1]]的forms创build一个列表,例如包含V1和I1(但我想交互式地select),所以:

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

我使用的代码是这样的:

 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(或更多)相同的名单。

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], [], []] 
 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]]