集合与直线交点的解法

1 投票
4 回答
986 浏览
提问于 2025-04-15 23:21

我在Python里有两个列表,我想知道它们在相同的索引位置是否有相同的元素。有没有什么数学方法可以解决这个问题呢?

比如说,如果我有两个列表:[9,8,7,6,5] 和 [3,4,5,6,7],我想要一个简单高效的公式或算法,能找到它们在索引3的位置是相同的。我知道可以通过搜索来找,但我在想有没有更好的方法。

我知道有一种公式可以通过相减来解决两个y = mx + b形式的直线问题,但我的“直线”其实并不是真正的直线,因为它只限于列表里的元素,而且可能会有曲线。

任何帮助都非常感谢。

4 个回答

0

我假设你列表中的一个维度是固定的,比如说 [9,8,7,6,5] 代表的是在 x1, x2, x3, x4, x5 这些位置的高度,对吧?那么在这种情况下,你的列表是怎么表示像 y=0 这样的曲线的呢?

无论如何,我觉得没有什么简单的方法可以用来计算一般或随机曲线的交点,最好的办法就是进行高效的搜索。

1
from itertools import izip
def find_intersection(lineA, lineB):
  for pos, (A0, B0, A1, B1) in enumerate(izip(lineA, lineB, lineA[1:], lineB[1:])):
    #check integer intersections
    if A0 == B0: #check required if the intersection is at position 0
      return pos
    if A1 == B1: #check required if the intersection is at last position
      return pos + 1
    #check for intersection between points
    if (A0 > B0 and A1 < B1) or
       (A0 < B0 and A1 > B1):
      #intersection between pos and pos+1!
      return pos + solve_linear_equation(A0,A1,B0,B1)
  #no intersection
  return None

...这里的 solve_linear_equation 是用来找出两条线段的交点的。第一条线段是从点 (0,A0) 到点 (1,A1),第二条线段是从点 (0,B0) 到点 (1,B1)

4

你可以把两个列表中坐标的交集拿出来:

intersecting_points = set(enumerate(list1)).intersection(set(enumerate(list2)))

...enumerate会给你一个可遍历的元组,里面包含索引和对应的值,也就是说,它会像这样返回(0,9)、(1,8)、(2,7)等等。

http://docs.python.org/library/stdtypes.html#set-types-set-frozenset

...明白了吗?当然,这样做并不能真正得到几何上的交点,比如说,[1,2]和[2,1]的交点是在[x=0.5,y=1.5] - 如果你想要这样的结果,那你就得在每个区间里解线性方程。

撰写回答