在python中测试字典上的等价关系

时间:2017-12-08 14:43:10

标签: python dictionary

给定一个关系作为元组列表

152.0.0.42.136

我有一个字典,用于将键映射到其等效类的列表

[(1,2), (1,3), (2,3), (2,1), (2,2), (3,2), (3,3)]

我想编写一个函数,给定这个字典检查关系是否具有传递性和对称性,这意味着

{1: [2, 3], 2: [3, 1, 2], 3: [2, 3]}

是否有可能以有效的方式编写它,而不会滥用嵌套循环?使用字典对程序的其他部分很有帮助,但我不确定它是否在这里。

帮助?

1 个答案:

答案 0 :(得分:1)

我认为你不需要在这里使用字典,因为这些关系已经很容易在元组列表中使用了。如果您使用字典,您可能仍会最终将其转换为d.items()的元组列表。

由于这些是关系,它实际上应该是一组元组,而不是列表,它可能有重复:

relations = {(1,2), (1,3), (2,3), (2,1), (2,2), (3,2), (3,3)}

您可以通过创建一个检查关系是否具有传递性的函数来开始:

def is_transitive(relation):
    for a, b in relation:
        for c, d in relation:
            # checks transitive property: (a, b) && (b, c) -> (a, c)
            if b == c and (a,d) not in relation:
                return False

    return True

然后你可以编写一个函数来检查关系是否与all()对称:

def is_symmetric(relation):
    # checks symmetric property: (a, b) -> (b, a)
    return all(rel[::-1] in relation for rel in relation)

然后你可以创建一个简单的函数来检查上述两个函数的结合:

def check_relation(relation):
    # True and True -> True
    # True and False -> False
    # False and True -> False
    # False and False -> False
    return is_symmetric(relation) and is_transitive(relation)

其工作原理如下(未经过广泛测试):

>>> relations = {(1,2), (1,3), (2,3), (2,1), (2,2), (3,2), (3,3)}
>>> print(check_relation(relations))
False