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

时间:2012-03-23 14:17:29

标签: python list dictionary tuples

我正在获取一个格式化为键值对列表的数据集。关键是数据源,值是数据元素。例如:

[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]

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

{'a': [3, 7],
'b': [5],
'c': [15],
'd': [12]}

有一种简单的方法可以做到吗?我认为必须有,但我似乎无法通过谷歌找到正确的提示。

6 个答案:

答案 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)

werkzeugpaste都提供了multidict实现。选一个,然后使用它。

答案 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]}