【发布时间】:2015-03-06 11:28:03
【问题描述】:
最近我遇到了一个question 关于找到子列表之间的交集。这告诉子列表具有任何(1 个或多个)交集一起成为一个。例如以下列表:
l=[[1,2,3],[0,13,6],[9,10],[3,4,5],[10,11],[6,7,50]]
必须转换为:
[[1, 2, 3, 4, 5],[0, 50, 6, 7, 13],[9, 10, 11]]
所以我编写了以下函数来完成它,它具有良好的性能,我使用set 来检查成员资格的快速复杂性,并且在内部循环中我使用切片将主列表的第一个索引与其他索引进行比较每个循环中的元素,还要注意每个循环后列表将减少,因为它是循环内的递归。 :
s=[set(i) for i in g 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
s=[set(i) for i in l if i]
print find_intersection(s)
[set([1, 2, 3, 4, 5]), set([0, 50, 6, 7, 13]), set([9, 10, 11])]
但我认为它可以用另一种解决方案来完成,也许性能更好,我想过collections.deque 或者numpy 或者只是修改我的功能并让它变得更好? .如果您有任何建议,我将不胜感激!
【问题讨论】:
标签: python list numpy data-structures intersection