在嵌套列表中移除停用词时触发list.remove(x):x not in list错误求助
问题分析与解决
错误原因
你的代码存在两个关键问题:
- 操作对象错误:你试图从外层列表
MM中移除子列表里的字符串j,但MM的元素是子列表(比如["s","mam"]),根本不存在单独的字符串元素,因此触发“元素不在列表中”的报错。正确的操作对象应该是当前遍历的子列表i,而非MM。 - 遍历修改列表的隐患:就算改成
i.remove(j),正序遍历子列表并删除元素时,会因列表长度变化导致部分元素被跳过(比如删除第一个元素后,后续元素前移,遍历索引会跳过下一个元素)。
正确实现方式
方式1:创建新列表(推荐,简洁安全)
用列表推导式直接生成过滤后的嵌套列表,避免遍历中修改原列表的问题:
stopwords = set(["s", "a", "about", "above"]) MM = [["s","mam"],["about","645"]] # 过滤每个子列表中的停用词 filtered_MM = [[word for word in sublist if word not in stopwords] for sublist in MM] print(filtered_MM) # 输出: [['mam'], ['645']]
方式2:倒序遍历子列表删除元素
如果需要修改原列表,可以倒序遍历子列表(从后往前删),这样不会影响未遍历的元素位置:
stopwords = set(["s", "a", "about", "above"]) MM = [["s","mam"],["about","645"]] for sublist in MM: # 倒序遍历索引,避免删除元素导致的遍历遗漏 for idx in range(len(sublist)-1, -1, -1): if sublist[idx] in stopwords: del sublist[idx] print(MM) # 输出: [['mam'], ['645']]
内容的提问来源于stack exchange,提问作者AtotheF
相关产品推荐
相关产品推荐

