2

我有一个这样的元组列表:

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 中完成此任务的最简单方法是什么?

4

1 回答 1

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) 的索引与主列表中 k 的索引相等。

于 2015-01-09T14:38:42.770 回答