a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
我想知道它a
应该在有序列表中的第 6 位b
。
这样做的最pythonic方式是什么?
a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
我想知道它a
应该在有序列表中的第 6 位b
。
这样做的最pythonic方式是什么?
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]
。
使用bisect。它不是最漂亮的 API,但它正是您所需要的。
您将要使用bisect.bisect
,它会返回您想要的内容。
边缘情况还有进一步的担忧。例如,假设您要选择上述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()
)计算。