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语法:trustyfor
循环。为什么要这样做?为什么不在键不变的地方使用字典呢?为什么不使用一个元素代表它们自己的集合呢?看起来有点像你没有使用列表的值。如果您实际上是将其存储在一个值中并使用它,那么这没关系,但是如果您只是使用它来巧妙地循环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大小要快得多。