Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中删除列表中的项_Python_List_Python 2.7 - Fatal编程技术网

在python中删除列表中的项

在python中删除列表中的项,python,list,python-2.7,Python,List,Python 2.7,尝试删除列表中的项目,未成功 >>> r = [1,2,3,4,5] >>> for i in r: if i<3: del i >>> print r [1, 2, 3, 4, 5] 我不明白为什么第一个不起作用。当我使用filter(function,iterable)时,我根本不理解结果 编辑: 看到保罗在下面的评论,现在我不明白为什么会这样 >>> for i in r:

尝试删除列表中的项目,未成功

>>> r = [1,2,3,4,5]
>>> for i in r:
    if i<3:
        del i


>>> print r
[1, 2, 3, 4, 5]
我不明白为什么第一个不起作用。当我使用
filter(function,iterable)
时,我根本不理解结果

编辑:

看到保罗在下面的评论,现在我不明白为什么会这样

>>> for i in r:
    if i<3:
        r.remove(i)


>>> print r
[3, 4, 5]
>>对于r中的i:
如果我>>打印r
[3, 4, 5]

迭代器问题是否仍然存在,代码是否应该只删除第一个元素(
r[0]

使用列表理解:

[i for i in r if i >= 3]
并保留而不是删除

您的过滤器从未返回测试;因此,您总是返回
None
,在布尔上下文中这是错误的。以下几点效果不错:

def f(i):
    return i > 2
您最初的尝试失败,因为
deli
解除了
i
的绑定,但列表仍不受影响。仅清除本地名称
i

如果要从列表中删除项目,则需要删除索引:

del r[0]
从列表中删除第一个元素

即使您成功删除了索引,循环也会带来一些惊喜:

>>> for i, element in enumerate(r):
...     if element < 3:
...         del r[i]
... 
>>> r
[2, 3, 4, 5]
>对于i,枚举(r)中的元素:
...     如果元素<3:
...         德尔r[i]
... 
>>>r
[2, 3, 4, 5]
此版本失败,因为
for
循环使用的列表迭代器不知道您从列表中删除了元素;删除索引0处的值会向上移动列表的其余部分,但循环迭代器会查看项目1:

  • 第一次迭代,
    r=[1,2,3,4,5]
    ,迭代器索引0->
    element=1
  • 第二次迭代,
    r=[2,3,4,5]
    ,迭代器索引1->
    element=3
我不明白为什么第一个不起作用

它不起作用,因为语句
deli
取消定义变量
i
——也就是说,它从包含它的范围(全局或局部)中删除它

当我使用filter(函数,iterable)时,我根本不理解结果

函数
f
不包含返回语句。因此,它总是返回
None
,其布尔等价值为
False
。因此,
filter
排除所有值


您可能应该做的是使用理解过滤,并替换列表,如下所示:

r = [i for i in r if i >= 3]
或者,如果确实要删除原始列表的一部分并对其进行修改,请在列表的某个部分使用
del

del r[:3]

看到保罗在下面的评论,现在我不明白[使用
删除
]为什么有效


因为
remove(r)
在列表中搜索值
r
,并删除它的第一个实例。因此,重复修改列表不会影响
remove
内部发生的迭代。但是,请注意,如果删除某个项导致在列表的迭代过程中跳过某个项,则仍然容易出现相同的错误。

使用
some\u列表。删除(项)
而不是
del(项)
。作为旁注,
i>2
已经是true或false,因此如果i>2否则为false,则不需要
true,只是
i>2
做了同样的事情。但你确实需要返回那个结果。@PauloScardine:这几乎总是个坏主意。除了在遍历列表时会导致相同的问题,它还意味着您会在列表中反复搜索您已经知道如何查找的值,并且当列表中有同一项的多个副本时,它通常不会执行您想要的操作,这也意味着你最终会重复搜索列表中你已经知道如何查找的值,而当列表中有同一项的多个副本时,它通常不会做你想做的事情,以此类推。你这是什么意思?为什么在这个特定的时间它能工作?@abarnert:使用
list是安全的。如果你向后循环,请删除python中的
?啊!我懂了!顺便说一句,在第一个例子中,保留而不是删除是什么意思?@tMJ:选择要保留的内容(保留)而不是删除不想保留的内容(删除)。@tMJ的意思是
r=[i for i In r if i>=3]
。这样,你就可以为你想要保留的元素创建一个新的列表,而不是删除你不想要的元素。你在最后一段中描述的问题是非常真实的,但这不是OP的代码中发生的事情,因为
deli
对列表没有任何影响。它只删除局部变量
i
(然后通过循环的下一次迭代重新创建)。好的,我不理解关于第一次尝试的解释。如果在第一次迭代中,(i=0),第一个元素被删除,列表应该打印为[2,3,4,5],不是吗?啊!关于
remove()
remove
的精彩解释并不总是有效的。考虑<代码> L=(1, 2, 3,4, 5)< /代码>,然后在L:L.Debug(i)中,<代码> >(i),如果i>2,则没有“< /代码>”。结果是
[1,2,4]
。(使用条件运算符,因为注释不允许多行代码。)@StevenRumbalski Fair comment。此处关于
remove
的解释具有误导性。它不起作用,因为
remove
与Martijn Pieters回答中的
del
不同;它成功了,因为他给了它错误的输入。尝试OP实际描述的代码,您将得到
[2,3,4,5]
,而不是
[3,4,5]
。除非你不小心连续运行了两次,我怀疑他就是这么做的。
del r[:3]