我有两个列表,一个整数和一个包含整数的元组,如下所示(这是一个例子)
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
的给定数字处切出一个孔,你应该在固定的底部数字线上滑动这个顶部数字线,以便看到尽可能多的孔中的颜色,确保相同的颜色不会出现两次?
我不知道这是否让事情更清楚 - 我希望它能做到!
是否存在用于执行此类任务的库/算法或方法,而不是强制它?
答案 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])