Python中list的remove()方法为何仅删除首个匹配元素?
问题分析与解决
你的代码里有几个关键错误导致没能删除所有匹配的元素:
- 循环条件使用
len(sorted(lt))完全多余,sorted返回的是新列表,长度不会随原列表的元素删除而变化,等于固定了循环的判断基准,无法正确响应原列表的长度变化。 return lt写在了while循环内部,导致第一次循环执行后就直接返回列表,根本没机会处理后续元素。- 删除元素后执行
i +=1会跳过下一个元素:删除lt[i]后,后面的元素会向前移位,原本的lt[i+1]变成了新的lt[i],此时i加1就会跳过这个位置的元素检查。
修复后的while循环写法
class Solution(object): def remove_occurances(self, lt, k): i = 0 while i < len(lt): if lt[i] == k: lt.remove(lt[i]) else: # 只有当前元素不等于k时,才移动索引 i += 1 return lt if __name__ == "__main__": p = [1, 1, 3, 4, 5, 5] k = 1 print(Solution().remove_occurances(p, k)) # 输出 [3,4,5,5]
更简洁的写法:列表推导式
直接生成不包含指定值的新列表,代码更简洁且可读性高:
class Solution(object): def remove_occurances(self, lt, k): return [num for num in lt if num != k] if __name__ == "__main__": p = [1, 1, 3, 4, 5, 5] k = 1 print(Solution().remove_occurances(p, k))
另一种写法:filter函数
用filter过滤掉等于k的元素,再转成列表:
class Solution(object): def remove_occurances(self, lt, k): return list(filter(lambda x: x != k, lt)) if __name__ == "__main__": p = [1, 1, 3, 4, 5, 5] k = 1 print(Solution().remove_occurances(p, k))
内容的提问来源于stack exchange,提问作者user20502753
相关产品推荐
相关产品推荐

