使用remove()结合循环删除符号列表元素:为何'o'未被删除?
遍历列表删除元素时跳过元素的原因分析
先看你的代码:
plist = ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] for i in plist: if i in "Don": plist.remove(i) print(plist) # 输出:['o', "'", 't', ' ', 'p', 'a', 'i', 'c', '!']
问题出在遍历过程中直接修改原列表,导致遍历的索引错位,跳过了'o'这个元素,具体过程如下:
- 初始列表:
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] - 第一次循环取索引0的
'D',符合删除条件,删除后列表变成['o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] - 遍历指针此时会移到下一个索引(即原索引1),但列表已经缩短,现在索引1的元素是
'n',删除它后列表变成['o', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] - 接下来遍历指针移到索引2,取到
't',不符合条件,后续循环继续处理后面的元素,而'o'此时在索引0,遍历指针不会再回头处理它,所以被保留了下来。
正确的解决方法
方法1:遍历原列表的副本,修改原列表
通过plist.copy()生成原列表的副本,遍历副本时修改原列表,避免索引错位:
plist = ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] for i in plist.copy(): if i in "Don": plist.remove(i) print(plist) # 输出:["'", 't', ' ', 'p', 'a', 'i', 'c', '!']
方法2:使用列表推导式生成新列表(推荐)
直接生成符合条件的新列表,逻辑更清晰,也不会修改原列表的结构:
plist = ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!'] plist = [x for x in plist if x not in "Don"] print(plist) # 输出:["'", 't', ' ', 'p', 'a', 'i', 'c', '!']
内容的提问来源于stack exchange,提问作者PilgrimQA
相关产品推荐
相关产品推荐

