如何保持列表的一致性?

时间:2012-02-06 19:21:53

标签: python

我有一个像

这样的清单
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']

4 个答案:

答案 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开始。 lstp_list

from numpy import *

lst = array(lst)
idx = ones(lst.shape,dtype=bool)
idx[p_list] = False

print lst[idx]

按预期提供['b' 'c' 'e' 'f']

相关问题