我有一个包含这样的元组的列表:
L ={(1,2), (1,4), (1,3), (2,3), (3,4), (3,5), (4,5), (6,7)}
我尝试将这些组合起来以获得等价类(相同值的元组被合并,如(1,2)和(2,3)变为(1,2,3))。所以你得到:
EQ = {(1,2,3,4,5), (6,7)}
在Python中实现这一目标的最简单方法是什么?
答案 0 :(得分:2)
您可以使用以下递归功能。首先,您可以将元素转换为set
并遍历集合并检查具有元素之后的任何元素if,当您找到具有任何交集的元素(v & k
)时,您将这些元素合并在一起并删除列表中的第二个元素并更新主列表:
L ={(1,2), (1,4), (1,3), (2,3), (3,4), (3,5), (4,5), (6,7)}
s=[set(i) for i in L if i]
def find_intersection(m_list):
for i,v in enumerate(m_list) :
for j,k in enumerate(m_list[i+1:],i+1):
if v & k:
s[i]=v.union(m_list.pop(j))
return find_intersection(m_list)
return m_list
print find_intersection(s)
结果:
[set([1, 2, 3, 4, 5]), set([6, 7])]
[Finished in 0.0s]
请注意,在第二个enumerate
函数中,我使用i + 1作为索引m_list[i+1:]
的起始编号,因为k(j)的索引与main中的k的索引相等名单。