[英]Dictionary comprehension for swapping keys/values in a dict with multiple equal values
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']}
我的问题是,字典理解也可以这样做吗? 此函数创建一个空的 dict inv = dict()
,然后在函数中稍后使用if/else
检查是否存在值。 在这种情况下,字典理解应该自我检查。 这可能吗,语法应该是什么样的?
交换值的通用字典理解语法是:
{value:key for key, value in somedict.items()}
但是如果我想添加一个“如果”子句,它应该是什么样子的? if value not in (what)
?
谢谢。
我认为在不使用其他函数的情况下进行简单的字典理解是不可能的。
以下代码使用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']}
您可以使用集合理解的副作用:
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']}
这是一个很好的答案:
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,第 2 版,第 (502) 页
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.