并非所有满足条件的元素都被删除

Posted

技术标签:

【中文标题】并非所有满足条件的元素都被删除【英文标题】:Not all elements that meet condition are deleted 【发布时间】:2021-09-13 04:00:09 【问题描述】:

基本上是标题所说的,我试图删除所有在字符串中包含数字的名称,我对代码的期望是:

['hello', 'number']

我得到的是:

['hello', 'number', 'Z23', 'Z46', 'U-557', 'U-81']

这里是我正在使用的代码:

allnames1 = ['hello','Z18', 'number','Z20', 'Z23', 'Z28', 'Z46','U-101', 'U-557', 'U-73', 'U-81', 'U-96']
for name in allnames1:
    x = re.findall("\d",name)
    if len(x) != 0:
        allnames1.remove(name)
print(allnames1)

为什么我的代码没有按预期工作?

我怎样才能修改它的代码以获得我的预期输出?

【问题讨论】:

【参考方案1】:

由于您循环遍历 allnames1 中的名称,但您在循环遍历列表时还从列表中删除元素,因此 Python 会忘记它在列表中的位置,并且每次您都会跳过一个删除一个。更好的解决方案是使用这样的列表推导:

import re

allnames1 = ['hello','Z18', 'number','Z20', 'Z23', 'Z28', 'Z46','U-101', 'U-557', 'U-73', 'U-81', 'U-96']
allnames1 = [name for name in allnames1 if len(re.findall("\d",name)) == 0]
print(allnames1)

有更有效的方法来检查那里没有数字,但我尽可能接近你的解决方案来展示这个想法。

【讨论】:

【参考方案2】:

如前所述,不要修改您正在迭代的对象。否则,使用列表推导。

>>> import re
>>> l = ['hello', 'number', 'Z23', 'Z46', 'U-557', 'U-81']
>>> [i for i in l if not re.search(r"\d", i)]
['hello', 'number']

【讨论】:

【参考方案3】:

正如在其他答案中指出的那样,您不应该在迭代列表时从列表中删除元素。它看起来是过滤功能的好候选

>>> import re
>>> allnames = ['hello','Z18', 'number','Z20', 'Z23', 'Z28', 'Z46','U-101', 'U-557', 'U-73', 'U-81', 'U-96']
>>> names_filtered = list(filter(lambda x: not bool(re.search("\d",x)), allnames))
>>> names_filtered
['hello', 'number']

【讨论】:

以上是关于并非所有满足条件的元素都被删除的主要内容,如果未能解决你的问题,请参考以下文章

删除索引满足条件的每个元素;列表分配索引超出范围

删除所有满足正则表达式条件的行

检查元组列表中的所有第一个元素是不是满足条件

在 Java 中从 ArrayList 中删除对象

根据条件删除列表元素

检查所有std :: tuple元素是否满足条件+设计问题