作为一种更快的方法,您可以首先创建一个长度大于1的项目集合列表(
s
),然后遍历您的列表并使用
union
函数进行就地更新!
s=map(set,g)
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:
m_list[i]=v.union(m_list.pop(j))
return find_intersection(m_list)
return m_list
演示:
g=[[], [], [0, 2], [1, 5], [0, 2, 3, 7], [4, 6], [1, 4, 5, 6], [], [], [3, 7]]
s=map(set,g)
print find_intersection(s)
[set([0, 2, 3, 7]), set([1, 4, 5, 6])]
g=[[1,2,3],[3,4,5],[5,6],[6,7],[9,10],[10,11]]
s=map(set,g)
print find_intersection(s)
[set([1, 2, 3, 4, 5, 6, 7]), set([9, 10, 11])]
g=[[], [1], [0,2], [1, 5], [0, 2, 3, 7], [4, 6], [1, 4, 5, 6], [], [], [3, 7]]
s=map(set,g)
print find_intersection(s)
[set([1, 4, 5, 6]), set([0, 2, 3, 7])]
与 @Mark 的回答进行基准测试:
from timeit import timeit
s1="""g=[[], [], [0, 2], [1, 5], [0, 2, 3, 7], [4, 6], [1, 4, 5, 6], [], [], [3, 7]]
sets = [set(i+j) for i in g for j in g if i!=j and (set(i) & set(j))]
"""
s2="""g=[[], [], [0, 2], [1, 5], [0, 2, 3, 7], [4, 6], [1, 4, 5, 6], [], [], [3, 7]]
s=map(set,g)
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 ' first: ' ,timeit(stmt=s1, number=100000)
print 'second : ',timeit(stmt=s2, number=100000)
first: 3.8284008503
second : 0.213887929916