我有一个列表A
,其中的元素表示形式为["item1", "relationstype" ,"item2"]
的关系
我想写一个函数,返回所有“relationstype”的列表,如果["item1", "relationstype" ,"item2"]
在a中,那么["item2", "relationstype" ,"item1"]
也在a中
对于rexample,如果A=[["item1", "relationstype1" ,"item2"],["item3", "relationstype2" ,"item2"],["item2", "relationstype1" ,"item1"],["item2", "relationstype2" ,"item3"],["item3", "relationstype2" ,"item4"]]
,则该方法应返回["relationstype1"]
这就是我所尝试的:
def find_symmetric_realations(A):
relation_dict = {}
symmetric_realations = set()
for elem in A:
relationstype = elem[1]
if relationstype not in relation_dict:
relation_dict[relationstype] = [(elem[0], elem[2])] # pout relation in dic
else:
if (elem[2],elem[0]) in relation_dict[relationstype]:
continue
else:
relation_dict[relationstype].append((elem[0], elem[2]))
# print(relation_dict[list(relation_dict.keys())[0]])
for elem in relation_dict:
if all((b,a) in relation_dict[elem] for (a,b) in relation_dict[elem]):
symmetric_realations.add(elem)
return list(symmetric_realations)
解释:在枚举(A)上循环,我们得到索引&;单一列表。”如果列表1的所有元素都在列表2中(来自第二个循环),则选中“存储为真”。如果check==true,但list1不等于list2,则打印中间值,即关系
以下函数用于在列表中查找对称关系:
更新
根据对问题的评论和编辑,原始答案是不正确的,因为它只考虑了给定关系是否存在匹配对,而不是要求该关系的所有元素都有匹配对。此函数解决了该问题:
例如:
输出:
原始答案
您可以使用列表强制执行此操作:
这将给
可以将其转换为具有唯一值的列表
如果
item1
与item2
不完全相同,也可以通过向列表添加i1 < i2
测试跳过最后一步:性能方面,您可能可以通过将
A
转换为一个集合(首先将其转换为元组之后)来改进它:相关问题 更多 >
编程相关推荐