将项目追加到python中的列表列表

这个问题已经在这里有了答案:

  • 列表更改列表意外地反映在子列表中 13个答案

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

我有一段代码,我想在其中创建一个列表列表,每个列表包含我从plot_data文件中读取的相同电路参数(电压,电流等)的值,如下所示:

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_data是包含所有值的列表,而positions是包含我要从.csv文件复制的列的索引的列表。 问题是,如果我尝试在外壳程序中执行命令,似乎可以正常工作,但是如果我运行脚本而不是将每个值附加到适当的子列表中,则会将所有值附加到所有列表中,因此得到2(或更多) )相同的列表。

clabacchio asked 2020-07-10T19:16:22Z
2个解决方案
90 votes

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], [], []]
joaquin answered 2020-07-10T19:17:00Z
2 votes
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]]
eumiro answered 2020-07-10T19:17:15Z
translate from https://stackoverflow.com:/questions/8713620/appending-items-to-a-list-of-lists-in-python