向列表字典中添加项

2024-05-14 05:39:36 发布

您现在位置:Python中文网/ 问答频道 /正文

假设下面的toyset(来自一个CSV文件,其中列名是“keys”,我只对放入“data”的一些行感兴趣):

keys = ['k1', 'k2', 'k3', 'k4']
data = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

我想要一本字典,每一列都有一个列表,如下所示:

{'k1': [1, 5, 9, 13], 'k2': [2, 6, 10, 14], 'k3': [3, 7, 11, 15], 'k4': [4, 8, 
12, 16]}

在我的代码中,我首先用空列表初始化字典,然后迭代(按键的顺序)以附加列表中的每个项。

my_dict = dict.fromkeys(keys, [])
for row in data:
    for i, k in zip(row, keys):
        my_dict[k].append(i)

但没用。它构建了这本词典:

{'k3': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 'k2': [1, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 'k1': [1, 2, 3, 4, 5, 6, 7, 8, 
9, 10, 11, 12, 13, 14, 15, 16], 'k4': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16]}

您可以看到所有元素都在所有列表中,而不是每个列表中只有四个元素。如果我在循环中打印I,k,它将执行正确的项和键对。所以我想问题是当我在k键的列表中添加I项时

有人知道为什么所有的元素都被添加到所有的列表中,还有什么是构建我的字典的正确方法吗?

提前谢谢


Tags: in元素列表fordata字典myk2
3条回答

我认为dict(zip(keys, map(list,zip(*data)) ))应该起作用。

首先,我转置您的数据(zip(*data)),但这将返回元组。。。因为您需要列表,所以我使用map从元组构造列表。然后,我们再次使用zip将键与列表中的项匹配。e、 g.(key1,list1), (key2,list2),...。这正是字典构造器所期望的,所以你是金的。

另一种解决方案是使用collections.defaultdict

d=collections.defaultdict(list)
tdata=zip(*data)  #transpose your data
for k,v in zip(keys,tdata):
    d[k].extend(v)

当然,这会留下一个defaultdict,而不是一个常规dict,尽管它可以简单地更改为常规的:d=dict(**d)

拉上拉链,但要先调换:

>>> keys = ['k1', 'k2', 'k3', 'k4']
>>> data = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
>>> print dict(zip(keys, zip(*data)))
{'k3': (3, 7, 11, 15), 'k2': (2, 6, 10, 14), 'k1': (1, 5, 9, 13), 'k4': (4, 8, 12, 16)}

如果要在数组中列出非元组:

>>> print dict(zip(keys, [list(i) for i in zip(*data)]))

如果你想使用你的版本,只需要理解字典,而不是fromkeys

my_dict = { k : [] for k in keys }

在您的情况下,问题是使用相同的值初始化my_dict

>>> my_dict = dict.fromkeys(keys, [])
>>> my_dict
{'k3': [], 'k2': [], 'k1': [], 'k4': []}
>>> my_dict['k3'].append(1)
>>> my_dict
{'k3': [1], 'k2': [1], 'k1': [1], 'k4': [1]}

当你做对了(字典/列表理解):

>>> my_dict = dict((k, []) for k in keys )
>>> my_dict
{'k3': [], 'k2': [], 'k1': [], 'k4': []}
>>> my_dict['k3'].append(1)
>>> my_dict
{'k3': [1], 'k2': [], 'k1': [], 'k4': []}

您遇到了问题explained in this answer:字典是用初始化的,所有值的列表对象都是相同的。简单使用

dict(zip(keys, zip(*data)))

相反。这将把行列表转换成列列表,然后将键和列压缩到一起。

相关问题 更多 >