【问题标题】:Dictionary comprehension for swapping keys/values in a dict with multiple equal values在具有多个相等值的字典中交换键/值的字典理解
【发布时间】:2014-02-02 15:11:23
【问题描述】:
def invert_dict(d):
    inv = dict()
    for key in d:
        val = d[key]
        if val not in inv:
            inv[val] = [key]
        else:
            inv[val].append(key)
return inv

这是 Think Python 书中的一个示例,一个用于反转(交换)字典中的键和值的函数。新值(以前的键)存储为列表,因此如果在反转之前有多个相等的字典值(绑定到不同的键),则此函数只需将它们附加到以前的键列表中。

例子:

somedict = {'one': 1, 'two': 2, 'doubletwo': 2, 'three': 3}
invert_dict(somedict) ---> {1: ['one'], 2: ['doubletwo', 'two'], 3: ['three']}

我的问题是,字典推导也可以这样做吗?此函数创建一个空字典inv = dict(),稍后在函数中使用if/else 检查值是否存在。在这种情况下,字典理解应该检查自己。这可能吗?语法应该如何?

交换值的通用字典理解语法是:

{value:key for key, value in somedict.items()}

但是如果我想添加一个“if”分句,它应该是什么样子? if value not in (what)?

谢谢。

【问题讨论】:

  • 通常缩短invert_dict 代码的方法是使用setdefaultdefaultdict。我不知道有什么方法可以在字典理解中写这个,并且怀疑这样做的任何方法都将是完全不可读的。

标签: python python-3.x swap dictionary-comprehension


【解决方案1】:

我认为在不使用其他函数的情况下使用简单的 dict 理解是不可能的。

以下代码使用itertools.groupby 对具有相同值的键进行分组。

>>> import itertools
>>> {k: [x[1] for x in grp]
     for k, grp in itertools.groupby(
         sorted((v,k) for k, v in somedict.iteritems()),
         key=lambda x: x[0])
    }
{1: ['one'], 2: ['doubletwo', 'two'], 3: ['three']}

【讨论】:

    【解决方案2】:

    您可以使用集合理解的副作用:

    somedict = {'one': 1, 'two': 2, 'doubletwo': 2, 'three': 3}
    
    invert_dict={}
    {invert_dict.setdefault(v, []).append(k) for k, v in somedict.items()}
    
    print invert_dict
    # {1: ['one'], 2: ['doubletwo', 'two'], 3: ['three']}
    

    【讨论】:

      【解决方案3】:

      这是一个很好的答案:

      fts = {1:1,2:1,3:2,4:1}
      
      new_dict = {dest: [k for k, v in fts.items() if v == dest] for dest in set(fts.values())}
      

      参考:Head First Python ,2nd Edition, Page(502)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-09
        • 2021-12-24
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多