Python列表过滤字符串异常:代码执行结果不符合预期求助
问题原因分析
你遇到的问题是因为在遍历列表的同时直接修改原列表,导致迭代器的索引错位。具体过程:
- 初始列表是
[1,2,'a','b'],迭代器依次访问索引0(1)、1(2)、2('a') - 当删除索引2的'a'后,列表变为
[1,2,'b'],原索引3的'b'自动前移到索引2 - 但迭代器的下一个目标是索引3,此时列表长度仅为3(最大索引为2),循环直接结束,'b'根本没被检查到
解决方案
方案1:遍历列表的副本
遍历原列表的副本,修改原列表时不会干扰迭代过程:
def filter_list(l): # 用l.copy()或list(l)创建副本,遍历副本而非原列表 for f in l.copy(): if isinstance(f, str): l.remove(f) return l print(filter_list([1,2,'a','b'])) # 输出 [1,2]
方案2:使用列表推导式(推荐)
这是Python处理过滤需求最简洁高效的方式,直接生成新的过滤后列表,避免修改原列表的副作用:
def filter_list(l): # 只保留非字符串类型的元素 return [item for item in l if not isinstance(item, str)] print(filter_list([1,2,'a','b'])) # 输出 [1,2]
列表推导式代码更短、可读性更强,性能也优于遍历删除的方式,是这类需求的首选方案。
内容的提问来源于stack exchange,提问作者Max Andersson
相关产品推荐
相关产品推荐

