我有一个像
这样的清单lst = ['a', 'b', 'c', 'd', 'e', 'f']
我有一个弹出位置列表
p_list = [0,3]
[lst.pop(i) for i in p_list]
在第一次迭代列表修改后将列表更改为['b', 'c', 'd', 'f']
。下一个pop工作在新的修改列表上。
但是我想从索引[0,3]的原始列表中弹出元素所以,我的新列表应该是
['b', 'c', 'e', 'f']
答案 0 :(得分:5)
很多合理的答案,这是另一个非常糟糕的答案:
[item for index, item in enumerate(lst) if index not in plist]
答案 1 :(得分:3)
您可以按照从最大索引到最小索引的顺序弹出元素,如下所示:
lst = ['a', 'b', 'c', 'd', 'e', 'f']
p_list = [0,3]
p_list.sort()
p_list.reverse()
[lst.pop(i) for i in p_list]
lst
#output: ['b', 'c', 'e', 'f']
答案 2 :(得分:1)
按顺序弹出弹出窗口:
>>> lst = ['a', 'b', 'c', 'd', 'e', 'f']
>>> p_list = [0, 3]
>>> [lst.pop(i) for i in reversed(p_list)][::-1]
['a', 'd']
>>> lst
['b', 'c', 'e', 'f']
这里的重要部分是在列表理解中你应该首先在后面的索引上调用lst.pop()
,所以这只有在p_list
保证按升序排列时才有效。如果不是这种情况,请改用以下内容:
[lst.pop(i) for i in sorted(p_list, reverse=True)]
请注意,如果这很重要,此方法会使p_list
的弹出项目按正确顺序变得更加复杂。
答案 3 :(得分:0)
您修改列表的方法可能容易出错,为什么不使用numpy
来访问您想要的索引元素?这样一切都保持不变(如果你以后需要它),并且很容易创建一个新的pop list
。从你的def开始。 lst
和p_list
:
from numpy import *
lst = array(lst)
idx = ones(lst.shape,dtype=bool)
idx[p_list] = False
print lst[idx]
按预期提供['b' 'c' 'e' 'f']
。