列表推导式是否适用于删除与另一列表元素匹配的列表项?
解决方案
完全可以用列表推导式实现该需求,你之前的写法逻辑错误,问题出在循环顺序和判断条件的设计上。
你的需求本质是:保留fruits中不包含test里任意一个关键词的元素,对应判断逻辑是对每个水果,检查所有test的关键词都不在该水果名称中,才保留。
正确写法
fruits = ["apple", "banana", "cherry", "kiwi", "mango"] test = ["nana", "erry"] fruitsNew = [y for y in fruits if all(x not in y for x in test)] print(fruitsNew)
运行输出为['apple', 'kiwi', 'mango'],和预期结果完全一致。
原写法问题说明
你之前写的双层for顺序是先遍历test、再遍历fruits,相当于test有多少个元素,整个fruits列表就会被完整遍历一次,每次只过滤掉包含当前遍历关键词的元素,多次遍历的结果直接拼接,自然会出现重复元素。
性能补充
如果数据量较大,这个写法比原始的嵌套循环+remove的方案性能更好:原始方案中list.remove()是O(n)操作,且修改列表过程中如果存在重复元素还可能出现索引异常风险,列表推导式的写法避免了额外的列表修改开销,可读性也更高。
内容的提问来源于stack exchange,提问作者sdoubleu
相关产品推荐
相关产品推荐

