例如我有一个列表:
L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
我想从列表中删除所有 1,这样我会得到:
L = [2, 2, 3, 6, 10, 3]
我尝试迭代列表,然后删除元素,如果它等于我要删除的元素(在这种情况下为 1),但事实证明你不能同时从列表中迭代和删除东西,因为它搞砸了数数。我想出的最好的办法就是构建一个不包含任何 1 的新列表 L2,然后将其放入 L,但是有没有只涉及变异 L 的解决方案?
但是有没有只涉及变异 L 的解决方案?
您可以迭代 List- 的副本L[:]
,并从中删除元素L
。这不会弄乱计数。
如果您真的不想创建新列表,则必须使用反向迭代range(len(L) - 1, -1, -1)
,但这不再是“Pythonic”。
>>> for x in L[:]:
... if x == 1:
... L.remove(x)
...
>>> L
[2, 2, 3, 6, 10, 3]
但是,您也可以使用List Comprehension:
>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> L[:] = [x for x in L if x != 1]
>>> L
[2, 2, 3, 6, 10, 3]
使用内置过滤器:
>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> filter(lambda x: x is not 1, L)
[2, 2, 3, 6, 10, 3]
或者您可以将其分配回L
:
>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> L = filter(lambda x: x is not 1, L)
>>> L
[2, 2, 3, 6, 10, 3]
您还可以将此概念包装到方法中,以便能够指定要包含/排除的项目列表:
def exclude(collection, exclude_list):
return filter(lambda x: x not in exclude_list, collection)
def include(collection, include_list):
return filter(lambda x: x in include_list, collection)
>>> L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]
>>> L = exclude(L, [1])
>>> L
[2, 2, 3, 6, 10, 3]
在没有复制列表的情况下在 python 中这样做很尴尬......
这将在不制作副本的情况下完成。
a = range(6) # Some array [0,1,2,3,4,5]
i=0
while i < len(a):
if a[i] == 4:
del a[i]
else:
i += 1
输出
>>> a
[0, 1, 2, 3, 5]
如果您不想改变列表或生成它的任何新副本。您可以从头到尾循环并使用索引:
>>> for i in range(len(L)-1, -1, -1):
... if L[i] == 1:
... del L[i]