30
a = 132

b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]

我想知道它a应该在有序列表中的第 6 位b

这样做的最pythonic方式是什么?

4

3 回答 3

40

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]

于 2012-07-02T09:16:10.477 回答
29

使用bisect。它不是最漂亮的 API,但它正是您所需要的。

您将要使用bisect.bisect,它会返回您想要的内容。

于 2012-07-02T09:12:32.750 回答
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())计算。

于 2017-07-18T14:59:17.267 回答