a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
我想知道a
应排在有序列表b
的第6位。
最蟒蛇的方法是什么?
答案 0 :(得分:32)
bisect
是Python标准库中的一个模块,非常适合此任务。模块bisect
中的函数bisect
将为您提供值的插入点的索引。
让我给出bisect
from bisect import bisect
a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
print(bisect(b, a))
结果将是5
,因为列表是从0开始的,所以实际上它是第6位。
您可以做的是将结果用于insert
。
index = bisect(b, a)
b.insert(index, a)
或没有中间变量
b.insert(bisect(b, a), a)
现在b
将是[0, 10, 30, 60, 100, 132, 150, 210, 280, 340, 480, 530]
。
答案 1 :(得分:23)
使用bisect。它不是最美丽的API,但它正是您所需要的。
您需要使用bisect.bisect
,它会准确返回您想要的内容。
答案 2 :(得分:2)
边缘案件还有待进一步关注。例如,假设您要在b
范围内选择上述(a, c)
中的元素,并使用
b[idx_a:idx_c]
然后你需要考虑a, c
实际上是b
的元素的情况。注意
bisect.bisect(b, 10)
bisect.bisect(b, 11)
都会给索引2.因此,如果a=10
我们需要将索引降低1.幸运的是,有一个函数bisect.bisect_left
正是这样做的,即在我们的例子中
bisect.bisect_left(b, 10)
给出1.
总体而言,左侧索引应使用bisect.bisect_left()
和右侧索引bisect.bisect_right()
(与bisect.bisect()
相同)计算。