【问题标题】:How to create a reverse dictionary that takes in account repeated values?如何创建一个考虑重复值的反向字典?
【发布时间】:2021-07-17 12:00:04
【问题描述】:

我正在尝试创建一个函数,该函数接收字典并在处理重复值的同时返回它的反转。也就是说,如果原始字典是

original_dict =  {'first': ['a'], 'second': ['b', 'c'], 'third': ['d'], 'fourth': ['d']}

函数应该返回

{'a': ['first'], 'b': ['second'], 'c': ['second'], 'd': ['third', 'fourth']}

我写过

def reversed_dict(d):
    new_dict = {}
    for keys,values in d.items():
        new_dict[values]=keys

但是当我尝试使用原始字典时,我在尝试该函数时收到错误“unhashable type: 'list'”。有什么提示可能是什么原因造成的吗?

【问题讨论】:

    标签: python function dictionary for-loop


    【解决方案1】:

    您还必须遍历列表中的值:

    def reversed_dict(d):
        new_dict = {}
        for keys,values in d.items():
            for val in values:
                new_dict.setdefault(val, []).append(keys)
       return new_dict
    

    【讨论】:

      【解决方案2】:

      您必须遍历这些值并将它们添加为键。您还必须考虑到您可能已经添加了一个值作为键。

      def reversed_dict(d):
          new_dict = {}
          for keys,values in d.items():
              for v in values:
                  if v in new_dict:
                      new_dict[v].append(keys)
                  else:
                      new_dict[v] = [keys]
          return new_dict
      

      【讨论】:

        【解决方案3】:

        使用collections.defaultdict:

        from collections import defaultdict
        
        def reversed_dict(d):
            new_dict = defaultdict(list)
            for key, values in d.items():
                for value in values:
                    new_dict[value].append(key)
        
            return new_dict
        

        您的方法的问题是您使用整个列表作为字典的键。相反,您需要遍历列表(即上面代码中的for value in values:。)

        defaultdict 只是让它更易于阅读。

        【讨论】:

          【解决方案4】:

          您收到此错误是因为您的任何 original_dict 值都是可变类型,正如错误所暗示的那样,它是一种不可散列的类型,因此不是 reversed_dict 中的键的有效候选者。

          您可以通过类型检查并将可变类型转换为不可变等价物来解决此问题,例如一个列表到一个元组中。

          (我也发现 dict comp 是一种更优雅、更简洁的方法):

          def reversed_dict(d):
              return {v if not isinstance(v, list) else tuple(v): k for k, v in d.items()}
          

          【讨论】:

            猜你喜欢
            • 2018-12-13
            • 1970-01-01
            • 2020-11-28
            • 2022-01-16
            • 2019-07-18
            • 1970-01-01
            • 2017-09-12
            • 2021-02-21
            • 2014-02-12
            相关资源
            最近更新 更多