如何检查字典是否可逆

我正在研究一个问题,该问题需要在确定字典是否可逆的函数中指出该问题(对于出现在字典中的每个值,只有一个键映射到该值)。问题如下:

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函数中存在问题;仅仅是因为adictadict = make_inv_dict(adict)中不是合适的变量名吗?还是该函数返回错误结果的另一个原因?

wwjazrael 回答:如何检查字典是否可逆

您提供的功能至少存在三个问题:

  1. 条件adict == inv_dict不仅检查字典是否可逆,还检查字典是否是其自身的逆
  2. 它使用pop_item从输入字典中删除键/值对,然后向后插入,因此该函数就地运行。到完成时,adict的原始内容将被完全破坏,因此无论如何,比较将毫无意义。
  3. 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
,

我的答案:

def is_invertible(dict_var):
    return len(dict_var.values()) == len(set(dict_var.values()))
本文链接:https://www.f2er.com/3137347.html

大家都在问