Python遍历列表删除含'!'字符的字符串时出现跳过后续元素问题
问题原因
你遇到的跳过元素问题核心原因是遍历原列表的同时对原列表执行了删除操作,列表属于可变对象,删除元素后列表长度会动态缩短,后续元素会自动前移补位,而for循环的迭代索引是按顺序递增的,就会跳过前移过来的那个元素。
举个对应你代码的具体例子:
初始列表索引对应关系:
- 索引0:
"Hey! How are you?" - 索引1:
"Wonderful drawing" - 索引2:
"Its good" - 索引3:
"No Idea"
第一轮循环迭代到索引0的元素,检测到包含!后删除该元素,此时列表长度变为3,原来索引1的"Wonderful drawing"会前移到索引0的位置。下一轮循环迭代器会自动取索引1的元素,也就是原来索引2的"Its good",直接跳过了前移到索引0的"Wonderful drawing"。
另外你代码里的内层for j in i遍历是冗余逻辑,判断字符串是否包含指定字符直接用'!' in 字符串即可,不需要逐个字符遍历判断。
修复方案
这里提供两种常用的可行写法:
方案1:遍历列表的浅拷贝副本,删除原列表元素
遍历用切片a[:]生成的列表副本,原列表的修改不会影响迭代的索引顺序:
a = ["Hey! How are you?", "Wonderful drawing", "Its good", "No Idea"] for i in a[:]: if '!' in i: a.remove(i) print(a)
方案2:列表推导式生成新列表(更推荐,Pythonic且效率更高)
直接筛选符合要求的元素生成新列表,不需要修改原列表:
a = ["Hey! How are you?", "Wonderful drawing", "Its good", "No Idea"] a = [i for i in a if '!' not in i] print(a)
两种方案输出结果均为:['Wonderful drawing', 'Its good', 'No Idea']
内容的提问来源于stack exchange,提问作者Yardy
相关产品推荐
相关产品推荐

