【问题标题】:Reverse a dictionary in python to key : list of values?将python中的字典反转为键:值列表?
【发布时间】:2017-12-04 16:50:52
【问题描述】:

如何将python字典d = {1:10, 2:20, 3:30, 4:30}转换为{10: [1], 20: [2], 30: [3, 4]}

我需要反转一个字典,值应该成为另一个字典的键,并且值应该是列表中的键,即也在排序的问题中。

【问题讨论】:

    标签: list python-3.x dictionary reverse


    【解决方案1】:
    o = {}
    for k,v in d.iteritems():
        if v in o:
            o[v].append(k)
        else:
            o[v] = [k]
    

    o = {10: [1], 20: [2], 30: [3, 4]}

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    【解决方案2】:

    这个 SO 问题解释了如何在 Python 2.7.x 和 3+ 中执行此操作:

    Python reverse / invert a mapping

    在下面的答案中显示了这种方法:

    inv_map = {}
    for k, v in d.iteritems():
        inv_map[v] = inv_map.get(v, [])
        inv_map[v].append(k)
    

    最好。

    【讨论】:

    • 如果键发生冲突,它不会创建列表。即结果将是{10: 1, 20: 2, 30: 4}
    • 在这种情况下,您的解决方案将是最佳选择。已编辑。
    【解决方案3】:
    d = {1:10, 2:20, 3:30, 4:30}
    inv = {}
    for key, val in d.iteritems():
        inv[val] = inv.get(val, []) + [key]
    

    试试这个!

    【讨论】:

      【解决方案4】:

      这个用例很容易被dict.setdefault()处理

      >>> d = {1:10, 2:20, 3:30, 4:30}
      >>> e = {}
      >>> for x, y in d.items():
              e.setdefault(y, []).append(x)
      
      >>> e
      {10: [1], 20: [2], 30: [3, 4]}
      

      另一种方法是使用collections.defaultdict。这有一个稍微复杂的设置,但内循环访问比 setdefault 方法更简单、更快。此外,它返回一个 dict 子类,而不是一个普通的 dict:

      >>> e = defaultdict(list)
      >>> for x, y in d.items():
              e[y].append(x)
      
      >>> e
      defaultdict(<class 'list'>, {30: [3, 4], 10: [1], 20: [2]})
      

      【讨论】:

        【解决方案5】:

        在 python dict 中反转键和值有点棘手。您应该记住,python dict 必须有一个 unique 键。

        因此,如果您知道在反转当前 dict 的键和值时将具有唯一键,您可以使用简单的dict comprehension,如下例所示:

        {v:k  for k,v in my_dict.items()}
        

        但是,您可以使用来自 itertools 模块的 groupby,如下例所示:

        from itertools import groupby
        
        a = {1:10, 2:20, 3:30, 4:30}
        b = {k: [j for j, _ in list(v)] for k, v in groupby(a.items(), lambda x: x[1])}
        print(b)
        
        >>> {10: [1], 20: [2], 30: [3, 4]}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-04
          • 2020-12-28
          • 2021-06-17
          • 1970-01-01
          相关资源
          最近更新 更多