【问题标题】:Bisect keep indexes of inserted items二等分保留插入项目的索引
【发布时间】:2016-06-27 19:16:19
【问题描述】:

我正在使用 bisect 模块在插入数字时保持列表的排序。 假设我将按此顺序插入三个数字9, 2, 5。 这个列表的最后一个状态显然是[2, 5, 9],但是,我有没有机会找到将数字插入到这个列表中的索引列表。对于此列表,它将是 [1, 2, 0]。所以我需要的列表是排序发生后的索引 [0, 1, 2] ,每次插入都会发生对分,这就是我找不到方法的原因。我可以使用sorted 函数的key 功能对其进行排序,但是我不想增加复杂性。所以我的问题是使用 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 一起使用。

【问题讨论】:

  • 什么?我不明白你的意思。鉴于每次插入都可能更改元素的位置,因此您所描述的内容不存在。您必须为每次插入定义所需的索引。你想要插入值的索引序列吗?那么这将是0(编号9 插入索引0)、0(编号2 插入位置0)和1(编号5 插入位置1)。如果这不是您的意思,请尝试更好地解释您到底想要什么,也许用一个稍微大一点的例子(比如 5 个元素,而不是 3 个)。
  • @Bakuriu 索引实际上是未排序列表的索引。我需要使用真实列表中的值排序的索引,而不是索引列表。我正在尝试通过 bisect 来实现这一目标。

标签: python sorting bisection


【解决方案1】:

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

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

在添加对象时,您需要自己跟踪索引,但由于序列首先按第一项排序,然后按下一项排序,依此类推,这仍然可以正确排序,无需任何额外努力。

【讨论】:

  • 元组是否使用最左边的元素排序? (我的意思当然是元组列表)
  • @MaxPythone 对,就是最后一句话的意思。
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2013-11-28
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多