Python - 如何从列表中删除类似的元素?

时间:2013-07-28 14:14:22

标签: python list element

例如,我有一个列表:

L = [1, 2, 2, 3, 1, 1, 6, 10, 1, 3]

我想删除列表中的所有1,以便我得到:

L = [2, 2, 3, 6, 10, 3]

我尝试迭代列表,然后删除元素,如果它等于我要删除的元素(在这种情况下为1),但事实证明你不能同时迭代和删除列表中的东西,因为它弄乱了计数。我想出的最好的事情就是构建一个新的列表L2,它不包含任何1,然后将其放入L中,但是有一个解决方案只涉及变异L吗?

4 个答案:

答案 0 :(得分:5)

  

但是有一个解决方案只涉及改变L?

您可以迭代遍历列表的副本 - 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]

但是,您也可以使用列表理解

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

答案 1 :(得分:1)

使用内置过滤器:

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

答案 2 :(得分:0)

如果您不想改变列表或生成任何新副本。您可以从end循环到begin并使用index:

>>> for i in range(len(L)-1, -1, -1):
...     if L[i] == 1:
...         del L[i]

答案 3 :(得分:0)

这在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]