我正在尝试创建一个函数,该函数接受字典并返回字典的反向值,同时处理重复值。也就是说,如果原始字典是
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()}