【发布时间】: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],而不是每个数字4、8和20。另外,在一个数字与一个元组匹配后,该元组是否也可以与其他数字匹配,还是不允许? -
查看我的编辑 - 我希望我能让事情变得更清楚。
-
你还没有说输出格式应该是什么。您是否想要一个字典,其键是
firstList中的数字,其值是secondList中的元组?还是你想要别的东西? -
那很好 - 但这真的不是这里的问题。问题是找到一种有效的方法来匹配两个数组,而无需考虑所有可能性。
-
看看我的回答。我还没有完全测试它,所以如果有问题,请告诉我,我会解决它
标签: python arrays python-3.x