【问题标题】:Invert keys and values of the original dictionary反转原始字典的键和值
【发布时间】:2011-09-05 07:25:33
【问题描述】:

例如,我通过传递一个字典作为参数来调用这个函数:

>>> inv_map({'a':1, 'b':2, 'c':3, 'd':2})
{1: ['a'], 2: ['b', 'd'], 3: ['c']}
>>> inv_map({'a':3, 'b':3, 'c':3})
{3: ['a', 'c', 'b']}
>>> inv_map({'a':2, 'b':1, 'c':2, 'd':1})
{1: ['b', 'd'], 2: ['a', 'c']}

如果

map = { 'a': 1, 'b':2 }

我只能把这张地图倒过来得到:

inv_map = { 1: 'a', 2: 'b' }

通过使用这个

dict((v,k) for k, v in map.iteritems())

任何人都知道如何为我的情况做这件事?

【问题讨论】:

    标签: python dictionary inverse


    【解决方案1】:

    您可以使用带有列表的默认字典:

    >>> from collections import defaultdict
    >>> m = {'a': 2, 'b': 1, 'c': 2, 'd': 1}
    >>> dd = defaultdict(list)
    >>> for k, v in m.iteritems():
    ...     dd[v].append(k)
    ... 
    >>> dict(dd)
    {1: ['b', 'd'], 2: ['a', 'c']}
    

    如果你不在乎有dict还是defaultdict,可以省略最后一步,直接使用defaultdict。

    【讨论】:

    • 请注意,最后一行——将collections.defaultdict 转换回普通的dict——通常是不必要的,甚至是不可取的。
    • @MikeGraham 你能解释一下为什么吗?不添加该行时,我经常会犯更多错误(因为如果您查找不存在的密钥,它会添加它)。
    【解决方案2】:

    您可以在这里使用defaultdictsetdefault

    def invertDictionary(orig_dict):
        result = {} # or change to defaultdict(list)
        for k, v in orig_dict.iteritems():
            result.setdefault(v, []).append(k)
    

    【讨论】:

      【解决方案3】:

      编辑在 python 2.7 中:

      from itertools import groupby
      def inv_map(d):
          return {k : [i[0] for i in list(v)] for k, v in groupby(d.items(),lambda x:x[1])}
      
      print inv_map({'a':1, 'b':2, 'c':3, 'd':2})
      print inv_map({'a':3, 'b':3, 'c':3})
      print inv_map({'a':2, 'b':1, 'c':2, 'd':1})
      

      输出:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 2023-01-21
        • 2020-11-28
        • 2015-03-26
        • 2022-01-11
        • 1970-01-01
        • 2016-07-10
        相关资源
        最近更新 更多