假设我有一个像这样的项目列表:
mylist=['a','b','c','d','e','f','g','h','i']
我想从左侧弹出两个项目(即a
和b
)和右侧两个项目(即h
,i
)。我想要最简单的简洁干净方式来做到这一点。我可以这样做自己:
for x in range(2):
mylist.pop()
mylist.pop(0)
还有其他选择吗?
答案 0 :(得分:18)
从表现的角度来看:
LinkedList
和ArrayList
相同mylist = mylist[2:-2]
<强>代码强>
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)]
这将从开头拉出前两个元素,从列表末尾拉出最后两个元素。其余项目保留在列表中。