【问题标题】:How to reverse a dictionary that has repeated values如何反转具有重复值的字典
【发布时间】:2010-05-12 22:48:35
【问题描述】:

我有一个包含近 100,000 个(键、值)对的字典,并且大多数键映射到相同的值。例如:

mydict =  {'a': 1, 'c': 2, 'b': 1, 'e': 2, 'd': 3, 'h': 1, 'j': 3}

我想要做的是反转字典,以便mydict 中的每个值都将成为reverse_dict 的一个键,并将映射到过去的所有mydict.keys() 的列表映射到mydict 中的那个值。所以根据上面的例子,我会得到:

reversed_dict = {1: ['a', 'b', 'h'], 2: ['c', 'e'] , 3: ['d', 'j']} 

我想出了一个非常昂贵的解决方案,我想听听比这更有效的方法:

reversed_dict = {}
for value in mydict.values():
    reversed_dict[value] = []
    for key in mydict.keys():
        if mydict[key] == value:
            if key not in reversed_dict[value]: 
                reversed_dict[value].append(key)

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    使用collections.defaultdict

    from collections import defaultdict
    
    reversed_dict = defaultdict(list)
    for key, value in mydict.items():
        reversed_dict[value].append(key)
    

    【讨论】:

    • 您可能希望使用defaultdict(set) 并将append() 替换为add()。这将删除重复项,但保留 uniq 值。
    • defaultdict(list) - 不错!
    【解决方案2】:
    reversed_dict = {}
    for key, value in mydict.items():
        reversed_dict.setdefault(value, [])
        reversed_dict[value].append(key)
    

    【讨论】:

    • 你甚至可以在一行中完成这两项操作:reversed_dict.setdefault(value, []).append(key)
    【解决方案3】:

    使用itertools.groupby

    from operator import itemgetter
    from itertools import groupby
    
    snd = itemgetter(1)
    
    def sort_and_group(itr, f):
        return groupby(sorted(itr, key=f), f)
    
    mydict =  {'a': 1, 'c': 2, 'b': 1, 'e': 2, 'd': 3, 'h': 1, 'j': 3}
    reversed_dict = {number: [char for char,_ in v] 
                     for number, v in sort_and_group(mydict.items(), snd)}
    

    【讨论】:

      【解决方案4】:
      for k,v in dict.iteritems():
          try:
            reversed_dict[v].append(k)
          except KeyError:
             reversed_dict[v]=[k]
      

      【讨论】:

        【解决方案5】:

        我认为您一次又一次地用相同的密钥替换一个密钥是在浪费几个周期......

        reversed_dict = {}
        for value in mydict.values():
            if value not in reversed_dict.keys(): #checking to be sure it hasn't been done.
                reversed_dict[value] = []
                for key in mydict.keys():
                    if mydict[key] == value:
                        if key not in reversed_dict[value]: reversed_dict[value].append(key)
        

        【讨论】:

          【解决方案6】:
          reversed_dict = collections.defaultdict(list)
          for key, value in dict_.iteritems():
            reversed_dict[value].append(key)
          

          【讨论】:

            【解决方案7】:
            def reverse_dict(mydict):
                v={}
                for x,y in mydict.items():
                    if  y not in v:
                        v[y]=[x]
                    else:
                        v[y].append(x)
                return v
            
            print(reverse_dict(mydict))
            

            【讨论】:

            • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
            • 这看起来像是对几个现有答案的重新散列。请阅读How to Answer,避免重复回答,尤其是老问题(这个问题已经超过十一岁了)。
            猜你喜欢
            • 1970-01-01
            • 2015-11-27
            • 2021-02-21
            • 2021-01-24
            • 1970-01-01
            • 1970-01-01
            • 2016-06-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多