用于交换具有多个相等值的字典中的键/值的字典理解

问题描述 投票:0回答:3
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检查该值是否存在。在这种情况下,听写理解应该自我检查。这可能吗,语法应该是什么样?

交换值的通用dict理解语法为:

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

但是如果我要添加'if'子句,它应该是什么样? if value not in (what)

谢谢。

python python-3.x swap dictionary-comprehension
3个回答
1
投票

您可以使用设定的理解副作用:

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']}

2
投票

我认为不使用其他功能就不可能通过简单的字典理解来实现。

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

itertools.groupby

0
投票

这里是一个很好的答案:

>>> 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']}

参考:Head First Python,第二版,第(502)页

© www.soinside.com 2019 - 2024. All rights reserved.