我正在研究一个问题,该问题需要在确定字典是否可逆的函数中指出该问题(对于出现在字典中的每个值,只有一个键映射到该值)。问题如下:
def is_invertible(adict):
inv_dict = make_inv_dict(adict)
return adict == inv_dict
def make_inv_dict(adict):
if len(adict) > 0:
key, val = adict.popitem()
adict = make_inv_dict(adict)
if val not in adict.values():
adict[key] = val
return adict
else:
return {}
当前,当假定为False
时,它将为{'a': 'b', 'b': 'e', 'c': 'f'}
返回True
。我确定make_inv_dict
函数中存在问题;仅仅是因为adict
在adict = make_inv_dict(adict)
中不是合适的变量名吗?还是该函数返回错误结果的另一个原因?
答案 0 :(得分:2)
您提供的功能至少存在三个问题:
adict == inv_dict
不仅检查字典是否可逆,还检查字典是否是其自身的逆。pop_item
从输入字典中删除键/值对,然后向后插入,因此该函数就地运行。到完成时,adict
的原始内容将被完全破坏,因此无论如何,比较将毫无意义。adict[key] = val
行以原始顺序插入键/值对;逆序应为adict[val] = key
。因此,此函数没有执行其名称所承诺的工作,即制作反字典。应该注意的是,如果不破坏字典(2.),错误(1.)和(3.)将被抵消,因为该函数的结果是重建原始字典,但没有重复的值。
我猜想如果有人在寻找正确的方法来反转字典,就会有人问这个问题,所以这是一个:如果可能,此函数返回反字典,否则返回None
。
def invert_dict(d):
out = dict()
for k,v in dict.items():
if v in out:
return None
out[v] = k
return out
Helper函数返回一个布尔值,表示字典是否可逆:
def is_invertible(d):
return invert_dict(d) is not None
答案 1 :(得分:1)
我的答案:
def is_invertible(dict_var):
return len(dict_var.values()) == len(set(dict_var.values()))