将具有相同值的列表中的元组合并
Combine tuples in a list which have the same value
我有一个这样的元组列表:
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 中完成此操作的最简单方法是什么?
您可以使用以下递归函数。首先,您可以将元素转换为 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 的索引在主列表中。
我有一个这样的元组列表:
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 中完成此操作的最简单方法是什么?
您可以使用以下递归函数。首先,您可以将元素转换为 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 的索引在主列表中。