Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找多个元组列表交集的高效/可伸缩Python算法?_Python_Algorithm_Set_Tuples_Intersection - Fatal编程技术网

查找多个元组列表交集的高效/可伸缩Python算法?

查找多个元组列表交集的高效/可伸缩Python算法?,python,algorithm,set,tuples,intersection,Python,Algorithm,Set,Tuples,Intersection,我有多个包含元组的列表,例如 list_A = [(start_1, end_1), (start_2, end_2), (start_3, end_3)] list_B = [(start_4, end_4), ...] 是否有一种聪明的方法可以生成一个只包含交叉点的结果列表,而不必以嵌套方式搜索每个列表O(n^m) 例如: list_A = [('8:00 AM', '10:00 AM'), ('12:59 PM', '3:00 PM'), ('5:04 PM', '7:23 PM')]

我有多个包含元组的列表,例如

list_A = [(start_1, end_1), (start_2, end_2), (start_3, end_3)]
list_B = [(start_4, end_4), ...]
是否有一种聪明的方法可以生成一个只包含交叉点的
结果列表
,而不必以嵌套方式搜索每个列表O(n^m)

例如:

list_A = [('8:00 AM', '10:00 AM'), ('12:59 PM', '3:00 PM'), ('5:04 PM', '7:23 PM')]
list_B = [('9:06 AM', '9:47 AM'), ('9:51 AM', '12:45 PM'), ('1:33 PM', '2:52 PM'), ...]
list_C = [...]
list_D = [...]
# etc. etc. (m lists)
有关此问题的说明,请参见下图:

您可以在O(m*n)中执行以下操作-


您可以在O(m*n)中执行以下操作-


你能举个例子吗?你在处理整数吗?花车?您的数据的性质是什么?也许您可以像您的绘图一样:创建一个二维数组(例如列表列表),并绘制元组,然后从数组中检查垂直列,就像我们可以从图像中目视检查一样?您是否在寻找开始和结束?还是只开始包含?@Binyaminen他们是时代-很抱歉没有包含example@antont听起来可能有用,但我的x轴是连续的,这使得离散化成为一个棘手的部分。你能举个例子吗?你在处理整数吗?花车?您的数据的性质是什么?也许您可以像您的绘图一样:创建一个二维数组(例如列表列表),并绘制元组,然后从数组中检查垂直列,就像我们可以从图像中目视检查一样?您是否在寻找开始和结束?还是只开始包含?@Binyaminen他们是时代-很抱歉没有包含example@antont听起来可能行得通,但我的x轴是连续的,这使得离散化成为一个棘手的部分
r = [[1,3], [5,7], [9,11]]
s = [[2,4], [5,6], [7,9], [11,14]]

r = [[i[0],i[1]+1] for i in r] #to make it inclusive at ends
s = [[i[0],i[1]+1] for i in s] #to make it inclusive at ends

overlapping_ranges = [set(range(*i[0])).intersection(set(range(*i[1]))) for i in list(itertools.product(r, s))]
overlapping_ranges = [i for i in overlapping_ranges if i] #removing nullsets
[{2, 3}, {5, 6}, {7}, {9}, {11}]