如何创建一个考虑重复值的反向字典



我正在尝试创建一个函数,该函数接受字典并返回字典的反向值,同时处理重复值。也就是说,如果原始字典是

original_dict =  {'first': ['a'], 'second': ['b', 'c'], 'third': ['d'], 'fourth': ['d']}

该函数应返回

{'a': ['first'], 'b': ['second'], 'c': ['second'], 'd': ['third', 'fourth']}

我写了

def reversed_dict(d):
new_dict = {}
for keys,values in d.items():
new_dict[values]=keys

但当我用原来的字典试用它时,我得到了一个错误";不可更改类型:"list";当我尝试函数时。有没有任何迹象表明是什么原因导致的?

您还必须迭代列表中的值:

def reversed_dict(d):
new_dict = {}
for keys,values in d.items():
for val in values:
new_dict.setdefault(val, []).append(keys)
return new_dict

您必须迭代这些值,并将它们作为键添加。您还必须考虑到您可能已经添加了一个值作为关键字的可能性。

def reversed_dict(d):
new_dict = {}
for keys,values in d.items():
for v in values:
if v in new_dict:
new_dict[v].append(keys)
else:
new_dict[v] = [keys]
return new_dict

使用collections.defaultdict:

from collections import defaultdict
def reversed_dict(d):
new_dict = defaultdict(list)
for key, values in d.items():
for value in values:
new_dict[value].append(key)
return new_dict

你的方法的问题是你使用了整个列表作为字典的关键字。相反,您需要迭代列表(即上面代码中的for value in values:(

defaultdict只是让阅读变得更简单。

您之所以出现此错误,是因为您的任何original_dict值都是可变类型,正如错误所示,它是不可更改的类型,因此不是用于CCD_ 5中的密钥的avalid候选者。

您可以通过类型检查和将可变类型强制转换为不可变的等价类型(例如,将列表转换为元组(来解决此问题。

(我还发现dictcomp是一种更优雅、更简洁的方法(:

def reversed_dict(d):
return {v if not isinstance(v, list) else tuple(v): k for k, v in d.items()}

最新更新