将Python字典键分组为列表,并使用此列表作为值创建新字典

时间:2013-04-01 21:12:03

标签: python list dictionary python-2.7

我有一个python字典

d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1}

由于上述字典中的值不是唯一的。我想将唯一值的所有键组合为一个列表,并创建一个新的字典,如下所示:

v = {6:[1], 1:[2, 3, 6], 9: [4, 5]}

请注意新词典 v 的键应排序。我发现很难想象和实现这个字典创建。请建议我一种简单有效的方法。

2 个答案:

答案 0 :(得分:48)

轻松使用collections.defaultdict

from collections import defaultdict

v = defaultdict(list)

for key, value in sorted(d.iteritems()):
    v[value].append(key)

但您也可以使用沼泽标准dict

v = {}

for key, value in sorted(d.iteritems()):
    v.setdefault(value, []).append(key)

在Python 3中,改为使用sorted(d.items())

答案 1 :(得分:13)

如果您在一天结束时实际上不需要dict,则可以使用itertools.groupby

from itertools import groupby
from operator import itemgetter

for k,v in groupby(sorted(d.items()),key=itemgetter(0)):
    print k,list(v)

当然,如果你真的想要,你可以用它来构建一个字典:

{k:list(v) for k,v in groupby(sorted(d.items()),key=itemgetter(0))}

但在那时,你可能最好使用Martijn的defaultdict解决方案。