如何在保留冗余值的同时将元组列表转换为字典?

qua*_*cle 2 python dictionary tuples list

我得到的数据集格式化为键值对列表.关键是数据源,值是数据元素.例如:

[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
Run Code Online (Sandbox Code Playgroud)

我想把这个列表变成字典.我可以使用Python的内置功能dict(),但它会抛弃冗余值并仅保留与给定键关联的最后一个值.我想将冗余值放入列表中,如下所示:

{'a': [3, 7],
'b': [5],
'c': [15],
'd': [12]}
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法来做上述事情吗?我认为必须有,但我似乎无法通过谷歌找到正确的提示.

Sve*_*ach 14

您可以使用setdefault()词典的方法:

d = {}
for key, value in my_list:
    d.setdefault(key, []).append(value)
Run Code Online (Sandbox Code Playgroud)

这也可以用a来完成defaultdict.这两个选项中哪一个更可取,取决于在d其余代码中使用的方式.A defaultdict永远不会给你一个KeyError,所以它可能会在代码中隐藏更多错误.


小智 7

dict子类defaultdictcollections模块可用于自动初始化一个新的list每一个键上的第一次访问它.

有了它,您只需循环输入对并将每个值附加到list相应键的值,以生成所需的值列表.

import collections    

data = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
result = collections.defaultdict(list)

for key, value in data:
    result[key].append(value)

print result
Run Code Online (Sandbox Code Playgroud)
defaultdict(<type 'list'>, {'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]})
Run Code Online (Sandbox Code Playgroud)
print result['a']
Run Code Online (Sandbox Code Playgroud)
[3, 7]
Run Code Online (Sandbox Code Playgroud)
print result['z']
Run Code Online (Sandbox Code Playgroud)
[]
Run Code Online (Sandbox Code Playgroud)