在python

时间:2016-07-26 23:54:47

标签: python arrays python-3.x

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

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的给定数字处切出一个孔,你应该在固定的底部数字线上滑动这个顶部数字线,以便看到尽可能多的孔中的颜色,确保相同的颜色不会出现两次?

我不知道这是否让事情更清楚 - 我希望它能做到!

是否存在用于执行此类任务的库/算法或方法,而不是强制它?

1 个答案:

答案 0 :(得分:0)

你的问题没有完全定义,但这是对我有意义的事情:

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