使用bisect将数字组合在两个列表中

时间:2015-09-25 15:35:00

标签: python python-3.x bisection

在以下两个列表中

l1 = [10, 33, 50, 67]
l2 = [7, 16, 29, 55]

目标是组合dict中最接近的数字,并且组合必须在到达第二个列表中的最后一个项目时停止,因此在这种情况下如果第一个列表中没有组合的项目,这些项目将不予考虑,因此上述列表的输出将为

10 -> 7
33 -> 29
50 -> 55
67 ->---   # in this case because the last n. in the first list(55) is identified, so the n.67 will be zero 

此代码提供以下输出

for s in l1:
    ind = bisect(l2, s, hi=len(l2) - 1)
    ind -= abs(l2[ind-1] - s) < l2[ind] - s
    print("{} -> {}".format(s, l2[ind]))

输出

10 -> 7
33 -> 29
50 -> 55
67 -> 55 ### here is the error, so here will be: 67 -> --, because, 55 is identified in the previous items.

声明

if ind == len(l2) - 1: 
    break

给出了这个输出

10 -> 7
33 -> 29 

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

如果你需要的是在达到l2的最后一个索引时终止循环,那么只要满足条件就使用break

for s in l1:
    ind = bisect(l2, s, hi=len(l2) - 1)
    ind -= abs(l2[ind-1] - s) < l2[ind] - s
    print("{} -> {}".format(s, l2[ind]))
    if ind == len(l2) - 1: break

这会产生您想要的样本输入输出:

>>> for s in l1:
...     ind = bisect(l2, s, hi=len(l2) - 1)
...     ind -= abs(l2[ind-1] - s) < l2[ind] - s
...     print("{} -> {}".format(s, l2[ind]))
...     if ind == len(l2) - 1: break
... 
10 -> 7
33 -> 29
50 -> 55