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

cla*_*hio 46 python csv list append

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

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

Sample, V1, I1, V2, I2
0, 3, 0.01, 3, 0.02
1, 3, 0.01, 3, 0.03
Run Code Online (Sandbox Code Playgroud)

等等.我想要的是以[[V1],[I1]]的形式创建一个列表,例如包含V1和I1(但我想以交互方式选择),所以:

[[3,3], [0.01, 0.01]]
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码是这样的:

plot_data = [[]]*len(positions)    
for row in reader:
    for place in range(len(positions)):
        value = float(row[positions[place]])
        plot_data[place].append(value)
Run Code Online (Sandbox Code Playgroud)

plot_data是包含所有值的列表,而是包含positions我要从.csv文件中复制的列的索引的列表.问题是,如果我尝试在外壳的命令,似乎工作,但如果我运行的脚本,而不是附加的每个值到适当的子列表,它附加到所有列表的所有值,所以我得到2(或更多)相同的清单.

joa*_*uin 91

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

plot_data = [[]] * len(positions) 
Run Code Online (Sandbox Code Playgroud)

你重复相同的列表len(positions)时间.

>>> plot_data = [[]] * 3
>>> plot_data
[[], [], []]
>>> plot_data[0].append(1)
>>> plot_data
[[1], [1], [1]]
>>> 
Run Code Online (Sandbox Code Playgroud)

列表中的每个列表都是对同一对象的引用.您修改一个,您会看到所有修改.

如果您想要不同的列表,可以这样做:

plot_data = [[] for _ in positions]
Run Code Online (Sandbox Code Playgroud)

例如:

>>> pd = [[] for _ in range(3)]
>>> pd
[[], [], []]
>>> pd[0].append(1)
>>> pd
[[1], [], []]
Run Code Online (Sandbox Code Playgroud)

  • @AustinA所有这意味着"我对此并不感兴趣".您不会将值分配给任何变量,以便以后不能引用它. - 通常情况下,`for range in range(3)`会让你访问一个动态变化的`i`,它首先是0,然后是1,然后是2.但是请注意上面的代码根本不关心这个值.它未被使用.所以你不妨把它扔掉. (2认同)