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