Bisect保留插入项目的索引

时间:2016-06-27 19:16:19

标签: python sorting bisection

我正在使用bisect模块在插入数字时对列表进行排序。 假设我要按此顺序插入三个数字9, 2, 5。 此列表的最后一个状态显然是[2, 5, 9],但是,我是否有机会找到将数字插入此列表的索引列表。对于此列表,它将是[1, 2, 0]。所以我需要的列表是排序发生之后的索引[0,1,2],在每次插入时都会发生二等分,这就是为什么我找不到方法。我可以使用key函数的sorted功能对其进行排序,但我不想增加复杂性。所以我的问题是这可以通过bisect模块实现吗?

这是我使用的代码,

import bisect

lst = []

bisect.insort(lst, 9)
bisect.insort(lst, 2)
bisect.insort(lst, 5)

print lst

编辑:另一个例子是,我要将数字4,7,1,2,9插入一些空列表。 (让我们首先假设没有二等分,我已经在列表中有数字了)

[4, 7, 1, 2, 9]
# indexes [0, 1, 2, 3, 4], typical enumeration
排序后

[1, 2, 4, 7, 9]
# now the index list [2, 3, 0, 1, 4]

可以在不增加复杂性的情况下使用bisect完成。

注意:插入的顺序不是任意的。众所周知,这就是为什么我尝试使用带有bisect的索引。

1 个答案:

答案 0 :(得分:0)

insort不知道项目的插入顺序。你必须自己添加这个逻辑。一种方法是插入由值和索引组成的2元组:

bisect.insort(lst, (9, 0))
bisect.insort(lst, (2, 1))
bisect.insort(lst, (5, 2))

当您添加对象时,您需要自己跟踪索引,但由于序列首先按第一项排序,然后按下一项等排序,所以仍然可以正确排序而无需任何额外的工作。< / p>