如何在python中的两个列表中找到float元组范围的交集?

Mel*_*uce 5 python

我有以下两种形式的清单:

lst1 = [(1.2, 4), (5, 8), (19, 21), (24.5, 26)]
lst2 = [(1, 3), (6.55, 14.871), (22, 23)]
Run Code Online (Sandbox Code Playgroud)

我想要得到的输出是:

output = [(1.2, 3), (6.55, 8)]
Run Code Online (Sandbox Code Playgroud)

基本上,我想要两个列表中元组定义的范围之间的交集。

您可以假设-

  1. 给定列表中排序的索引。例如,在lst2中:

    1 < 6.55 < 22
    
    Run Code Online (Sandbox Code Playgroud)
  2. 有效范围(在一个元组中,startVal <= endEndVal)。在lst2中:

    1 < 3  and 6.55 < 14.871 and 22 < 23
    
    Run Code Online (Sandbox Code Playgroud)

什么是实现此目标的有效方法?

Lin*_*nda 2

我认为最好的方法是使用列表理解,因为两个列表的长度相同。

为了便于阅读,分为两个列表:

# get the min max ranges
a = [(max(i[0], j[0]),min(i[1],j[1])) for i,j in zip(lst1, lst2)]
# check that min is smaller than max
a = [(i,j) for (i,j) in a if i < j]
Run Code Online (Sandbox Code Playgroud)

或在一个列表中:

a = [(i,j) for (i,j) in [(max(i[0], j[0]),min(i[1],j[1])) for i,j in zip(lst1, lst2)] if i < j]
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是lst1[3]和lst2[2]相交,它们的交集是(24.5, 25) (2认同)
  • @Linda您的代码的问题是它只比较元组的第i个元素(因为您使用zip)。因此,如果“lst1”将“(0,0)”作为第一个元素,它将与“(1,3)”进行比较,并跳过“(1.2,4)”与“(1,3)”之间的比较也跳过所有其他点 - 给你一个空列表作为解决方案,这是不正确的 (2认同)