【问题标题】:Appending to one list in a list of lists appends to all other lists, too [duplicate]追加到列表列表中的一个列表也追加到所有其他列表[重复]
【发布时间】:2012-02-01 13:44:30
【问题描述】:

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

我有这段代码,我想在其中创建一个列表列表,每个列表都包含我从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_data 是包含所有值的列表,而positions 是一个列表,其中包含我要从 .csv 文件中复制的列的索引。问题是,如果我尝试 shell 中的命令,似乎可以工作,但如果我运行脚本而不是将每个值附加到正确的子列表,它会将所有值附加到所有列表,所以我获得 2(或更多) 相同的列表。

【问题讨论】:

    标签: python list csv append


    【解决方案1】:

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

    【讨论】:

    • 太棒了!正是我想要的
    • 有人对下划线黑魔法有很好的解释吗?我相信它被用作throwaway variable,但我仍然不太明白这意味着什么。
    • @AustinA 从您链接的 SO 问题中选择的答案中您到底不明白什么?
    • @AustinA 这意味着“我对此不感兴趣”。您没有将值分配给任何变量,因此您以后无法引用它。 - 通常,for i in range(3) 会让您访问动态变化的i,它首先是 0,然后是 1,然后是 2。但是请注意上面的代码根本不关心这个值。它没用。所以你还不如_把它扔掉。
    • 这太棒了。完全会改变我在 Python 中的编程风格!没早点发现这个感觉有点傻。
    【解决方案2】:
    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]]
    

    【讨论】:

    • 对,但我需要动态选择要打印的值的数量和集合...可以是一个和多个一样...
    • @clabacchio - 更新了我的答案。现在它适用于任何列顺序。
    猜你喜欢
    • 2020-08-08
    • 2020-09-24
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多