如何找到一个索引,在该索引处可以将新项目插入到排序列表中并保持其排序?

时间:2012-07-02 09:11:00

标签: python sortedlist

a = 132

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

我想知道a应排在有序列表b的第6位。

最蟒蛇的方法是什么?

3 个答案:

答案 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()相同)计算。