【问题标题】:Efficient/scalable Python algorithm for finding the intersection of multiple lists of tuples? [duplicate]用于查找多个元组列表交集的高效/可扩展 Python 算法? [复制]
【发布时间】:2020-08-27 23:12:35
【问题描述】:

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

list_A = [(start_1, end_1), (start_2, end_2), (start_3, end_3)]
list_B = [(start_4, end_4), ...]

有没有一种聪明的方法来生成一个只包含交叉点的result_list,而不必以嵌套方式 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)

请参阅下图以了解问题的说明:

【问题讨论】:

  • 你能提供一个例子吗?你在处理整数吗?浮动?你数据的性质是什么??
  • 也许你可以像你的绘图那样做:创建一个二维数组(例如列表列表),绘制出元组,然后以与我们相同的方式从数组中检查垂直列从图像视觉上做?
  • 您在寻找包含开头和结尾的内容吗?还是只开始包容?
  • @BinyaminEven they're time - 抱歉没有提供示例
  • @antont 听起来可能可行,但我的 x 轴是连续的,这使得离散化成为其中一个棘手的部分

标签: python algorithm set tuples intersection


【解决方案1】:

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

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}]

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2015-11-12
    • 2018-08-08
    • 2023-04-04
    • 2010-12-06
    • 2012-01-18
    • 2011-01-01
    • 2020-07-08
    相关资源
    最近更新 更多