【问题标题】:Return a dictionary with keys for a given dictionary's values and vice versa返回带有给定字典值的键的字典,反之亦然
【发布时间】:2016-12-08 12:38:29
【问题描述】:

我将如何在函数中创建一个字典,其键是给定字典的值,反之亦然,其中给定字典的每个键有多个值? 例如,给定一个字典:

d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]}

我需要返回一个像这样的字典:

d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]}

我唯一的想法是列出所有值,然后手动检查每个键的每个值,但在不知道键和值的数量的情况下我无法弄清楚如何做到这一点。任何帮助将不胜感激。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    试试:

    {letter: [key for key in d if letter in d[key]] for letter in set(letter for key in d for letter in d[key])}
    

    解释:set(letter for key in d for letter in d[key]) 是原始字典中出现的所有字母的集合。然后我们创建一个新的字典,其中每个条目都是letter: [key for key in d if letter in d[key]],表示其中一个字母,映射到原始字典中映射到它的数字列表。

    【讨论】:

      【解决方案2】:

      轻松使用collections.defaultdict(),默认为list

      • 在排序后的键/值对上循环
      • 值项的内循环
      • 对于每个值项,使用原始字典键创建/更新列表

      代码:

      import collections
      
      d3 = collections.defaultdict(list)
      
      for k,v in sorted(d.items()):
          for vi in v:
              d3[vi].append(k)  # create list or append to existing list
      
      print(dict(d3))
      

      结果:

      {'b': ['1', '2'], 'd': ['3'], 'c': ['2', '3'], 'a': ['1', '2']}
      

      【讨论】:

      • 这很好,但是有什么简洁的方法可以在不导入模块的情况下做到这一点?
      • 您可以使用普通的dict 并将d3[vi].append(k) 替换为d3.setdefault(vi, []).append(k),而不是使用defaultdict。无需导入。
      【解决方案3】:
      data = [(key, value) for key, values in d.items() for value in values]
      d2 = defaultdict(list)
      
      for value, key in data:
          d2[key].append(value)
          print(key, value)
      

      【讨论】:

        【解决方案4】:

        这是我找到的解决方案5 years ago

        from operator import itemgetter
        from itertools import groupby
        d = {'1': ['a', 'c'],'2': ['a', 'b', 'c'], '3': ['b']}
        d2 = {x: [t[1] for t in group] for (x, group) in  groupby(sorted(((j, k) for k, v in d.items() for j in v), key=itemgetter(0)), key=itemgetter(0))}
        # {'a': ['1', '2'], 'c': ['1', '2'], 'b': ['2', '3']}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-16
          • 2011-06-24
          • 1970-01-01
          • 2013-08-07
          • 2019-09-10
          • 2023-02-14
          • 2019-11-30
          相关资源
          最近更新 更多