是否可以将一个元素添加到列表并保留顺序

时间:2009-08-01 23:34:05

标签: python

我想在保存列表顺序的列表中添加一个元素。

假设对象列表是 [a,b,c,d] 我有一个函数 cmp ,它比较列表的两个元素。如果我添加一个更大的f对象,我希望它在最后一个位置。

也许最好对整个列表进行排序......

3 个答案:

答案 0 :(得分:5)

是的,这是bisect.insort的用途,但不需要比较功能。如果对象是自定义对象,则可以覆盖一个或多个rich comparison methods以建立所需的排序顺序。或者你可以存储一个带有排序键的2元组作为第一个项目,然后对其进行排序。

答案 1 :(得分:4)

在适用的情况下,

bisect.insort比append-then-sort快一点(除非你需要添加一些元素才能再次对列表进行排序) - 在我的笔记本电脑上照常测量(一台速度更快的机器当然会更快,但比率应保持大致不变):

$ python -mtimeit -s'import random, bisect; x=range(20)' 'y=list(x); bisect.insort(y, 22*random.random())'
1000000 loops, best of 3: 1.99 usec per loop

VS

$ python -mtimeit -s'import random, bisect; x=range(20)' 'y=list(x); y.append(22*random.random()); y.sort()'
100000 loops, best of 3: 2.78 usec per loop

当然,您对这种差异的关注程度取决于此操作对您的应用程序的瓶颈有多严重 - 当然,即使这一小部分微秒也会产生重大影响,尽管它们是例外情况而不是规则。

bisect模块不够灵活且可配置 - 您可以轻松地将自己的自定义比较器传递给排序(尽管如果您可以将其设置为key = argument的形式,那么强烈建议这样做;在Python 3中,只有key = still,cmp =已经消失,因为性能不能很好),而bisect严格使用内置比较(所以你有根据自己的喜好将对象包装成实现__cmp____le__的包装器,这也会产生重要的性能影响。)

在你的鞋子里,我首先采用追加式排序的方法,只有在剖析表明性能受到影响的情况下才能切换到不太方便的二等分方法。记住Knuth's(和Hoare's)的名言,Kent Beck's几乎同样着名! -

答案 2 :(得分:0)

L.insert(index, object) -- insert object before index