从原始字典中反转键和值并排序

时间:2016-03-12 07:56:32

标签: python dictionary key invert

任何人都可以告诉我如何获取我的代码以生成下面所需的输出。干杯

def dict_invert(d):
    inv = {}
    for k, v in d.iteritems():
        keys = inv.setdefault(v, [])
        keys.append(k)
    return inv

我的输入1:>>> dict_invert({30000: 30, 600: 30, 2: 10})

我的输出1:>>> {10: [2], 30: [30000, 600]}

期望的输出1 >>> {10: [2], 30: [600, 30000]}

我的输入2:>>> dict_invert({0: 9, 9: 9, 5: 9})

我的输出2:>>> {9: [0, 9, 5]}

所需的输出2:>>> {9: [0, 5, 9]}

2 个答案:

答案 0 :(得分:2)

您可以使用collections.defaultdict按输入字典的值将输入字典的键分组到列表中:

from collections import defaultdict

def dict_invert(d):
    dd = defaultdict(list)
    for k in d:
        dd[d[k]].append(k)
    return {k:sorted(dd[k]) for k in dd} 

>>> dict_invert({30000: 30, 600: 30, 2: 10})
{10: [2], 30: [600, 30000]}
>>> dict_invert({0: 9, 9: 9, 5: 9})
{9: [0, 5, 9]}

因此,对于这些示例,这会产生您想要的输出。目前尚不清楚您是否还希望按键对结果字典进行排序。在上面的示例中,键显示为已排序,但实际上并不是因为字典没有固有顺序。

>>> dict_invert({30000: 30, 600: 30, 2: 10, 1234: -1})
{10: [2], 30: [600, 30000], -1: [1234]}

如果您想要订购钥匙,请查看collections.OrderedDict

def dict_invert(d):
    dd = defaultdict(list)
    for k in d:
        dd[d[k]].append(k)
    return OrderedDict(sorted((k, sorted(dd[k])) for k in dd))

>>> dict_invert({30000: 30, 600: 30, 2: 10, 1234: -1})
OrderedDict([(-1, [1234]), (10, [2]), (30, [600, 30000])])

答案 1 :(得分:0)

 function dict_invert(obj){

        var objArr = {};
        for(var key in obj){
            if(!objArr[obj[key]]){
                objArr[obj[key]] = [];

            }
            objArr[obj[key]].push(key);        
        }

        return objArr;

    }
    var objArr = dict_invert({30000: 30, 600: 30, 2: 10});