我正在获取一个格式化为键值对列表的数据集。关键是数据源,值是数据元素。例如:
[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
我想将此列表转换为字典。我可以使用Python的内置dict()
,但它会抛弃冗余值并仅保留与给定键关联的最后一个值。我想将冗余值放入列表中,如下所示:
{'a': [3, 7],
'b': [5],
'c': [15],
'd': [12]}
有一种简单的方法可以做到吗?我认为必须有,但我似乎无法通过谷歌找到正确的提示。
答案 0 :(得分:14)
您可以使用setdefault()
字典方法:
d = {}
for key, value in my_list:
d.setdefault(key, []).append(value)
这也可以使用defaultdict
来完成。这两个选项中哪一个更可取决于d
在其余代码中的使用方式。 defaultdict
永远不会为您提供KeyError
,因此可能会在代码中隐藏更多错误。
答案 1 :(得分:7)
dict
模块中的defaultdict
子类collections
可用于在您第一次访问时为每个密钥自动初始化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
defaultdict(<type 'list'>, {'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]})
print result['a']
[3, 7]
print result['z']
[]
答案 2 :(得分:3)
def multidict(lst):
result = collections.defaultdict(list)
for key, value in lst:
result[key].append(value)
return result # or dict(result) if you don't want to keep defaultdict
答案 3 :(得分:1)
from collections import defaultdict
l = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
d = defaultdict(list)
for k, v in l:
d[k].append(v)
print d
请参阅此处的第一个示例:http://docs.python.org/release/2.5.2/lib/defaultdict-examples.html
答案 4 :(得分:0)
答案 5 :(得分:0)
>>> d=[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
>>> f={}
>>> for k,v in d:
... f[k]=f.get(k,[])+[v]
...
>>> f
{'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]}