python删除lis中某个值的所有条目

2024-04-26 17:28:20 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么这个for循环不起作用?我的目标是从列表中删除1。在

>>> s=[1,4,1,4,1,4,1,1,0,1]
>>> for i in s:
...   if i ==1: s.remove(i)
... 
>>> s
[4, 4, 4, 0, 1]

Tags: in目标列表forifremove
3条回答

不要在遍历列表时更改列表。结果是不可预测的,正如你在这里看到的。一个简单的选择是构建一个新列表:

s = [i for i in s if i != 1]

如果出于某种原因,您必须在适当的地方编辑列表,而不是创建一个新的索引,我的即兴最佳答案是遍历它,找到必须删除的索引,然后反向遍历索引列表,逐个删除它们:

^{pr2}$

因为这会首先从列表末尾移除元素,所以计算的原始索引仍然有效。但除非有特殊情况,否则我通常更喜欢计算新列表。在

考虑以下代码:

  #!/usr/bin/env python

  s=[1, 4, 1, 4, 1, 4, 1, 1, 0, 1]
  list_size=len(s)
  i=0

  while i!=list_size:
      if s[i]==1:
          del s[i]
          list_size=len(s)
      else:
          i=i + 1

  print s

结果:

^{pr2}$

简言之,您的代码会得到一些不理想的结果,因为每当您减少数字1时,列表的“大小”和“索引位置”都会发生变化,并且您的代码清楚地证明了Python中的for each loop不能处理动态大小的列表。在

迭代列表时不应更改列表的内容

但是您可以迭代列表内容的副本,并在您的情况下更改它

代码:

s=[1,4,1,4,1,4,1,1,0,1]
for i in s[:]:
    if i ==1: s.remove(i)
print s

输出:

^{pr2}$

正如@metatoaster所说,您可以使用filter

代码:

s=[1,4,1,4,1,4,1,1,0,1]
s=list(filter(lambda x:x !=1,s))
print s
[4, 4, 4, 0]

您可以使用过滤器删除多个东西示例

代码:

s=[1,4,1,4,1,4,1,1,0,1,2,3,5,6,7,8,9,10,20]
remove_element=[1,2,3,5,6,7,8,9]
s=list(filter(lambda x:x not in remove_element,s))
print s
[4, 4, 4, 0, 10, 20]

相关问题 更多 >