在python中将项目附加到列表列表中

在python中将项目附加到列表列表中,python,list,csv,append,Python,List,Csv,Append,我对列表索引很生气,无法解释我做错了什么 我有一段代码,我想在其中创建一个列表列表,每个列表包含我从一个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]] 我使用的代码是: plot_data = [[

我对列表索引很生气,无法解释我做错了什么

我有一段代码,我想在其中创建一个列表列表,每个列表包含我从一个
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]]
我使用的代码是:

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

是的,但我需要以友好的方式选择要打印的值的数量和集合…可以是一样多的…@clabacchio-更新了我的答案。现在它可以处理任意顺序的列。太棒了!就我刚才所想的,有人对黑魔法有很好的解释吗?我相信它被用作一个例子,但我仍然不太明白这意味着什么。@AustinA从你所链接的问题中选择的答案中,你到底不明白什么?@AustinA所有的意思都是“我对这个不感兴趣”。您没有将该值分配给任何变量,因此以后无法引用它。-通常情况下,范围(3)中的i的
将允许您访问动态变化的
i
,它首先是0,然后是1,然后是2。但是请注意,上面的代码根本不关心这个值。它没用过。所以你最好把它扔掉。这太棒了。完全改变我用Python编程的风格!因为没有早点找到这个,我觉得有点傻。
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]]