Python 3.x 无法将值列表附加到字典的特定键

Python 3.x 无法将值列表附加到字典的特定键,python-3.x,dictionary,Python 3.x,Dictionary,1) 首先,我将键名映射到一个名为main_dict的字典,其中有一个空列表(实际的问题有许多键,因此我这样做的原因) 2) 然后我在一个由3列组成的数据矩阵上循环 3) 当我向字典中的列(键)追加值时,数据被追加到错误的键 我哪里出了问题 最低工作示例: 编辑:数据正在逐行从文件中读取,并且不存在于此MWE中的列表中。 编辑2:比起熊猫,我更喜欢一种更具蟒蛇精神的解决方案 import numpy as np key_names = ["A", "B", "C"] main_dict = {}

1) 首先,我将键名映射到一个名为main_dict的字典,其中有一个空列表(实际的问题有许多键,因此我这样做的原因)

2) 然后我在一个由3列组成的数据矩阵上循环

3) 当我向字典中的列(键)追加值时,数据被追加到错误的键

我哪里出了问题

最低工作示例: 编辑:数据正在逐行从文件中读取,并且不存在于此MWE中的列表中。 编辑2:比起熊猫,我更喜欢一种更具蟒蛇精神的解决方案

import numpy as np
key_names = ["A", "B", "C"]
main_dict = {}
val = []
main_dict = main_dict.fromkeys(key_names, val)

data = np.array([[2018, 1.1, 3.3], [2017, 2.1, 5.4], [2016, 3.1, 1.4]])

for i in data:
    main_dict["A"].append(i[0])
    main_dict["B"].append(i[1])
    main_dict["C"].append(i[2])

print(main_dict["A"])

# Actual output: [2018.0, 1.1, 3.3, 2017.0, 2.1, 5.4, 2016.0, 3.1, 1.4]

# print(main_dict["A"])
# Expected output: [2018.0, 2017.0, 2016.0]
# print(main_dict["B"])
# Expected output: [1.1, 2.1, 3.1]
# print(main_dict["C"])
# Expected output: [3.3, 5.4, 1.4]

如果不使用numpy(这是一个很重的软件包),我会这样做:

keys = ["A", "B", "C"]
main_dict = {key: [] for key in keys}

data = [[2018, 1.1, 3.3], [2017, 2.1, 5.4], [2016, 3.1, 1.4]]

# since you are reading from a file
for datum in data:
    for index, key in enumerate(keys):
        main_dict[key].append(datum[index])

print(main_dict) # {'A': [2018, 2017, 2016], 'B': [1.1, 2.1, 3.1], 'C': [3.3, 5.4, 1.4]}
或者,您可以使用内置的
defaultdict
,由于不需要进行字典理解,因此速度稍微快一点:

from collections import defaultdict
main_dict = defaultdict(list)

keys = ["A", "B", "C"]
data = [[2018, 1.1, 3.3], [2017, 2.1, 5.4], [2016, 3.1, 1.4]]

# since you are reading from a file
for datum in data:
    for index, key in enumerate(keys):
        main_dict[key].append(datum[index])

print(main_dict)
最后,如果关键点对您来说真的不重要,那么您可以从
a
开始动态地创建关键点,从而变得更加动态。因此,允许行具有三个以上的属性:

from collections import defaultdict
main_dict = defaultdict(list)

data = [[2018, 1.1, 3.3], [2017, 2.1, 5.4], [2016, 3.1, 1.4]]

# since you are reading from a file
for datum in data:
    for index, attr in enumerate(datum):
        main_dict[chr(ord('A') + index)].append(attr)

print(main_dict) # {'A': [2018, 2017, 2016], 'B': [1.1, 2.1, 3.1], 'C': [3.3, 5.4, 1.4]}
问题在于

main_dict = main_dict.fromkeys(key_names, val)

由于python传递了引用,所以所有键都引用了相同的列表val

追加数据是有原因的,因为它是从文件中逐行读取的。您的解决方案是优雅的,但我不确定列表(zip(*数据))是否适用于这里?这稍微改变了一些事情。。。给我一分钟。有没有比使用熊猫更具Python风格的解决方案?@bwrr 1)查看我的更新。2)我不会考虑使用一个外部模块“Python”,特别是NumPy和熊猫,这是相当大的,因此增加了很多的项目。这些软件包确实有它们的用例(特别是在AI和机器学习中),Numpy在矩阵逻辑方面非常快;但是,您在这里并没有这样做,因此只是无缘无故地向代码中添加大型包。谢谢您的解释。我想知道您能否解释一下为什么我以前的解决方案没有正确地将列表分配给键?这也许能帮助我理解我的逻辑哪里出了问题。