从列表的开头和结尾弹出多个项目

时间:2014-06-16 13:36:25

标签: python arrays list

假设我有一个像这样的项目列表:

mylist=['a','b','c','d','e','f','g','h','i']

我想从左侧弹出两个项目(即ab)和右侧两个项目(即hi)。我想要最简单的简洁干净方式来做到这一点。我可以这样做自己:

for x in range(2):
    mylist.pop()
    mylist.pop(0)

还有其他选择吗?

6 个答案:

答案 0 :(得分:18)

从表现的角度来看:

  • LinkedListArrayList相同
  • 它们比第一个解决方案mylist = mylist[2:-2]
  • 快3倍左右

<强>代码

del mylist[:2];del mylist[-2:]

<强>输出

1.07710313797e-06

3.44465017319e-07

3.49956989288e-07

答案 1 :(得分:10)

您可以切出一个新列表,保留旧列表:

mylist=['a','b','c','d','e','f','g','h','i']
newlist = mylist[2:-2]

newlist现在返回:

['c', 'd', 'e', 'f', 'g']

您也可以覆盖对旧列表的引用:

mylist = mylist[2:-2]

上述两种方法都会使用比下面更多的内存。

你自己试图做的是内存友好,但它的缺点是它会改变你的旧列表,但popleft不适用于Python中的列表,它是collections.deque对象的一种方法

这在Python 3中运行良好:

for x in range(2):
    mylist.pop(0)
    mylist.pop()

在Python 2中,只使用xrange和pop:

for _ in xrange(2):
    mylist.pop(0)
    mylist.pop()

Martijn建议删除最快的方式,(这只会删除列表对项目的引用,不一定是项目本身):

del mylist[:2]
del mylist[-2:]

答案 2 :(得分:7)

如果您不想保留这些值,可以删除索引:

del myList[-2:], myList[:2]

这仍然需要将所有剩余项目移动到列表中的位置。两个.popleft()调用也需要这样做,但至少现在list对象可以一步处理的移动

没有创建新的列表对象。

演示:

>>> myList = ['a','b','c','d','e','f','g','h','i']
>>> del myList[-2:], myList[:2]
>>> myList
['c', 'd', 'e', 'f', 'g']

但是,从您使用popleft开始,我强烈怀疑您使用的是collections.dequeue() object。如果是这样,*坚持使用popleft(),因为这比在列表对象上切片或del更有效。

答案 3 :(得分:2)

前两个元素:myList[:2]
最后2个元素:mylist[-2:]

所以myList[2:-2]

答案 4 :(得分:0)

Python3 有一些很酷的功能,类似于JS中的其他功能(但是如果您需要弹出很多东西会很痛苦)

mylist=['a','b','c','d','e','f','g','h','i']
_, _, *mylist, _, _ = mylist
mylist == ['c', 'd', 'e', 'f', 'g']  # true

答案 5 :(得分:-1)

对我来说,这是使用生成器函数完成它的最漂亮的方法:

>> mylist=['a','b','c','d','e','f','g','h','i']
>> newlist1 = [mylist.pop(0) for idx in range(1)]
>> newlist2 = [mylist.pop() for idx in range(1)]

这将从开头拉出前两个元素,从列表末尾拉出最后两个元素。其余项目保留在列表中。