删除列表中前N个元素的最有效方法是?


74

我需要从Python 2.7中的对象列表中删除前n个元素。有没有使用循环的简单方法?


1
x.pop(5)del x[5]x.remove("cow")。前两个按索引删除,后两个按搜索条件删除。第二种方法可以合并,del x[2:5]从而使指标得分2-5
2015年

为什么是5?如果我有例如[a,b,c,d,e,f,g ... z]并且只想保留[f,g ... z]?
RedVelvet 2015年

然后,您需要做的是。pos = x.index("f"); end = x.index("z"); del x[pos:end]您必须考虑到z以前可能存在的情况,fpos在搜索z等时用作起始点,但是您知道了。
2015年

也许您想要列表[n:]
juankirr 2015年

Answers:


99

您可以使用列表切片来归档目标:

n = 5
mylist = [1,2,3,4,5,6,7,8,9]
newlist = mylist[n:]
print newlist

输出:

[6, 7, 8, 9]

或者,del如果您只想使用一个列表:

n = 5
mylist = [1,2,3,4,5,6,7,8,9]
del mylist[:n]
print mylist

输出:

[6, 7, 8, 9]

44

Python列表并未在列表的开头进行操作,并且在此操作中非常无效。

虽然你可以写

mylist = [1, 2 ,3 ,4]
mylist.pop(0)

这是非常低效的。


如果您只想从列表中删除项目,则可以使用del

del mylist[:n]

这也真的很快:

In [34]: %%timeit
help=range(10000)
while help:
    del help[:1000]
   ....:
10000 loops, best of 3: 161 µs per loop

如果需要从列表的开头获取元素,则应使用collections.dequeRaymond Hettinger及其popleft()方法。

from collections import deque

deque(['f', 'g', 'h', 'i', 'j'])

>>> d.pop()                          # return and remove the rightmost item
'j'
>>> d.popleft()                      # return and remove the leftmost item
'f'

一个对比:

清单+弹出(0)

In [30]: %%timeit
   ....: help=range(10000)
   ....: while help:
   ....:     help.pop(0)
   ....:
100 loops, best of 3: 17.9 ms per loop

deque + popleft()

In [33]: %%timeit
help=deque(range(10000))
while help:
    help.popleft()
   ....:
1000 loops, best of 3: 812 µs per loop

使用del mylist [:n]仍然效率低下吗?
RedVelvet

我很好奇:pop如果list支持数组,如何才能高效?wiki.python.org/moin/TimeComplexity
西罗(Ciro Santilli)郝海东冠状病六四事件法轮功

@RedVelvet:是的。但是,关于dequevslist请记住,该双端队列并不具有所有功能list。在较大的班次(100万行)上,我发现del mylist[1000000:]deque.popleft()所有行都执行相同的操作。
gies0r

哇,实际上是在规格上您可以在调用双端队列时进行迭代popleft()吗?
基督教徒

2
l = [1, 2, 3, 4, 5]
del l[0:3] # Here 3 specifies the number of items to be deleted.

如果您要从列表中删除多个项目,则这是代码。您最好跳过冒号前的零。它没有那么重要。这也可能这样做。

l = [1, 2, 3, 4, 5]
del l[:3] # Here 3 specifies the number of items to be deleted.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.