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

Sha*_*kar 37 python dictionary list python-2.7

我有一个python字典

d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1}
Run Code Online (Sandbox Code Playgroud)

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

v = {6:[1], 1:[2, 3, 6], 9: [4, 5]}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 59

collections.defaultdict轻松使用:

from collections import defaultdict

v = defaultdict(list)

for key, value in sorted(d.iteritems()):
    v[value].append(key)
Run Code Online (Sandbox Code Playgroud)

但你也可以用沼泽标准来做到这dict一点:

v = {}

for key, value in sorted(d.iteritems()):
    v.setdefault(value, []).append(key)
Run Code Online (Sandbox Code Playgroud)

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


mgi*_*son 14

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

from itertools import groupby
from operator import itemgetter

for k,v in groupby( sorted(d.items(),key=itemgetter(1)), itemgetter(1) ):
    print k,list(map(itemgetter(0),v))
Run Code Online (Sandbox Code Playgroud)

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

{k:list(map(itemgetter(0),v)) for k,v in groupby( sorted(d.items(),key=itemgetter(1)), itemgetter(1) )}
Run Code Online (Sandbox Code Playgroud)

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

  • 你的字典不起作用,而是产生:`{1:[(1,6)],2:[(2,1)],3:[(3,1)],4:[(4,9 )],5:[(5,9)],6:[(6,1)]}` (2认同)