并非所有满足条件的元素都被删除
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']
【讨论】:
以上是关于并非所有满足条件的元素都被删除的主要内容,如果未能解决你的问题,请参考以下文章