如何检查字典是否可逆

问题描述 投票:-1回答:2

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

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)中不是合适的变量名吗?还是函数返回错误结果的另一个原因?

python dictionary inverse
2个回答
2
投票

您提供的函数至少有三个问题:

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

1
投票

我的答案:

def is_invertible(d):
    return invert_dict(d) is not None
© www.soinside.com 2019 - 2024. All rights reserved.