附加项目列表在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]]