给定一个关系作为元组列表
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]}
是否有可能以有效的方式编写它,而不会滥用嵌套循环?使用字典对程序的其他部分很有帮助,但我不确定它是否在这里。
帮助?
答案 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