Python 如何保持列表的一致性?

Python 如何保持列表的一致性?,python,Python,我有一张这样的清单 lst = ['a', 'b', 'c', 'd', 'e', 'f'] 我有一份流行的职位清单 p_list = [0,3] [p_列表中i的lst.pop(i)]将列表更改为['b','c','d','f'],在第一次迭代后,在此处修改列表。下一个pop在新修改的列表上工作 但是我想从索引[0,3]处的原始列表中弹出元素,因此,我的新列表应该是 ['b', 'c', 'e', 'f'] 持久性有机污染物是否按相反顺序排放: >>> lst = [

我有一张这样的清单

lst = ['a', 'b', 'c', 'd', 'e', 'f']
我有一份流行的职位清单

 p_list = [0,3]
[p_列表中i的lst.pop(i)]
将列表更改为
['b','c','d','f']
,在第一次迭代后,在此处修改列表。下一个pop在新修改的列表上工作

但是我想从索引[0,3]处的原始列表中弹出元素,因此,我的新列表应该是

['b', 'c', 'e', 'f']

持久性有机污染物是否按相反顺序排放:

>>> 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\u list
保证按升序排列时,这才有效。如果情况并非如此,请改用以下方法:

[lst.pop(i) for i in sorted(p_list, reverse=True)]

请注意,如果重要的话,此方法会使按正确顺序从
p\u列表
中获取弹出项变得更加复杂。

按相反顺序进行弹出:

>>> 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\u list
保证按升序排列时,这才有效。如果情况并非如此,请改用以下方法:

[lst.pop(i) for i in sorted(p_list, reverse=True)]

请注意,如果重要的话,此方法会使从
p_列表
中按正确顺序获取弹出项变得更加复杂。

您可以按从最大索引到最小索引的顺序弹出元素,如下所示:

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']

您可以按从最大索引到最小索引的顺序弹出元素,如下所示:

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']

修改列表的方法可能容易出错,为什么不使用
numpy
只访问所需的索引元素呢?这样一来,所有的东西都会保持原样(以备以后需要),而且创建一个新的
流行列表
非常简单。从你的def开始。在
lst
p\u列表中:

from numpy import *

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

print lst[idx]

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

修改列表的方法可能容易出错,为什么不使用
numpy
仅访问所需的索引元素?这样一来,所有的东西都会保持原样(以备以后需要),而且创建一个新的
流行列表
非常简单。从你的def开始。在
lst
p\u列表中:

from numpy import *

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

print lst[idx]

按照预期给出了
['b''c''e''f']

许多合理的答案,下面是另一个非常糟糕的答案:

[item for index, item in enumerate(lst) if index not in plist]

有很多合理的答案,这里还有一个非常糟糕的答案:

[item for index, item in enumerate(lst) if index not in plist]

你为什么这么做?为什么不在键不变的地方使用字典呢?为什么不使用一个元素代表它们自己的集合呢?看起来有点像你没有使用列表的值。如果您实际上是将其存储在一个值中并使用它,那么这没关系,但是如果您只是使用它来巧妙地循环
p_list
的元素,那么有一种更好的python语法:trusty
for
循环。为什么要这样做?为什么不在键不变的地方使用字典呢?为什么不使用一个元素代表它们自己的集合呢?看起来有点像你没有使用列表的值。如果您实际上是将其存储在一个值中并使用它,那么这没关系,但是如果您只是使用它来巧妙地循环
p\u list
的元素,还有一种更好的python语法:可靠的
for
循环。Numpy似乎是一种过度依赖,只是为了获得列表上的视图。@Ineral哦,我完全同意——尽管有时看到替代解决方案很好。我还试图说明为什么它可能比其他方法有优势(可重用性、更少的会计错误等)。Numpy似乎是一种过度依赖,只是为了获得列表上的视图。@Ineral哦,我完全同意——尽管有时看到替代解决方案很好。我还试图说明为什么它可能比其他方法(可重用性、更少的会计错误等)有优势。这是最干净、最清晰、最快速(因此也是最具python风格)的方法。爱列表理解+1表示最干净和最清晰。我的$.02是:对于大的plist,如果你调用
pset=set(plist)
,然后
[索引项,如果索引不在pset中,枚举(lst)中的项]
对于大的plist大小来说要快得多。这是做这件事的最干净、最清晰和最快速的方法。爱列表理解+1表示最干净和最清晰。My$.02是:对于大plist,如果调用
pset=set(plist)
,然后调用
[索引项,如果索引不在pset中,枚举(lst)中的项]
则对于大plist大小要快得多。