【问题标题】:Match up/overlap arrays in python在python中匹配/重叠数组
【发布时间】:2023-03-20 07:35:02
【问题描述】:

我有两个列表,一个是整数,另一个是包含整数的元组,如下所示(这是一个示例)

firstList = [4, 8, 20, 25, 60, 123]
secondList = [(0, 3), (4, 5), (7, 14), (19, 22), (40, 90), (100, 140)]

我想尽可能地将第一个数组匹配(重叠)到第二个数组。例如:

数组[4, 8, 20] 的第一部分将与[(4, 5), (7, 14), (19, 22)] 匹配,因为这些第一个数字落在它们各自元组中的数字之上或之间。

25 将被忽略,因为没有匹配项

[60, 123] 将匹配 [(40, 90), (100, 140)]

上面的实现相当简单,但是我遇到的问题是存在一个偏移量,它会把所有东西都扔掉。假设从第一个数组中的所有数字中减去 4,所以我们现在剩下

firstList = [0, 4, 16, 21, 56, 119]
secondList = [(0, 3), (4, 5), (7, 14), (19, 22), (40, 90), (100, 140)]

一些数字仍然匹配,但不是全部,现在21 属于(19, 22) 的范围,应该忽略它,而其他一些数字现在属于错误的范围。这些新数字如何仍然以“可能的最佳方式”匹配,换句话说,以匹配最多的方式?

理想情况下,该方法会计算出向后添加偏移量 4,然后再次匹配数字。


澄清编辑 数字和元组将按升序排列(如上所示),任何给定的数字不能与多个元组匹配,任何给定的元组不能与多个数字匹配。是 1 比 1。

我想要从这里返回的三件事是 1:在这种情况下,偏移量 (4) 可以让事情得到最好的匹配。 2:与元组匹配的数字是什么,它们与哪个元组匹配。 3:在最佳情况下哪些数字不匹配(匹配最多)。

这是一个插图,但我不知道这是否会有所帮助。想象一张长长的纸沿着带有数字线的桌子。元组指示的部分沿着它们涂有颜色的条纹(每个数字部分用不同的颜色)涂在它们上面(例如从 0 到 3 的红色条纹,从 4 到 5 的紫色条纹等)。没有任何数字部分的区域留空(或白色)

然后你有第二张纸(也有印刷的数字线)放在第一个上面,在firstList给定数字处切出孔在尽可能多的孔中确保相同的颜色不会出现两次?

我不知道这是否会让事情变得更清楚 - 我希望是这样!

除了暴力破解之外,是否有执行此类任务的库/算法或方法?

【问题讨论】:

  • 请充分解释您的示例所需的输出是什么。我了解数字如何与元组匹配,但我不明白您为什么要匹配 [4, 8, 20],而不是每个数字 4820。另外,在一个数字与一个元组匹配后,该元组是否也可以与其他数字匹配,还是不允许?
  • 查看我的编辑 - 我希望我能让事情变得更清楚。
  • 你还没有说输出格式应该是什么。您是否想要一个字典,其键是firstList 中的数字,其值是secondList 中的元组?还是你想要别的东西?
  • 那很好 - 但这真的不是这里的问题。问题是找到一种有效的方法来匹配两个数组,而无需考虑所有可能性。
  • 看看我的回答。我还没有完全测试它,所以如果有问题,请告诉我,我会解决它

标签: python arrays python-3.x


【解决方案1】:

您的问题尚未完全确定,但我认为这是有道理的:

def binSearch(x, L, low=None, high=None):
    if low is None: low = 0
    if high is None: high = len(L)
    if low==high: return None

    mid = int((upper+lower)/2)
    lower, upper = L[mid]

    if lower <= x <= upper: return mid

    if x>high: return binSearch(x, L, mid+1, high)
    return binSearch(x, L, low, mid)


def match(L, T):
    answer = {}
    for num in L:
        m = binSearch(num, T)
        if m is None: continue
        answer[num] = L[m]
        L.pop(m)
    return answer


def main():
    firstList = [4, 8, 20, 25, 60, 123]
    secondList = [(0, 3), (4, 5), (7, 14), (19, 22), (40, 90), (100, 140)]
    matches = match(firstList, secondList)
    for k in sorted(matches):
        print(k, "matches with", matches[k])

【讨论】:

    猜你喜欢
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2012-02-18
    • 2020-11-03
    • 2011-08-02
    • 2020-07-21
    相关资源
    最近更新 更多