为何此Python代码中的List comprehension无法实现去重,生成含重复元素的列表(而非如set()般得到无重复元素的结果)?
为什么这段Python列表推导式没能消除重复元素?
先来看你的代码和对应的输出:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] new_list = [] new_list.append([num for num in a+b if num not in new_list]) print(new_list)
输出结果:
[[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]]
问题核心原因
问题出在列表推导式的执行逻辑和你的预期不匹配:
- 列表推导式是一次性完整生成整个结果列表,然后才会执行
new_list.append(...)操作。在推导式运行的全过程中,new_list始终是空列表——因为append要等推导式出结果后才会触发。 - 这就导致
num not in new_list这个判断条件永远为True,所有元素(包括重复项)都会被保留在推导出来的列表里,最后整个列表被作为单个元素添加到new_list中,自然就出现了嵌套且带重复元素的结果。
修复方案
如果你想得到去重后的列表(非嵌套),可以用以下几种方法:
方法1:保留元素出现顺序的去重
Python 3.7+的字典会保留插入顺序,我们可以利用dict.fromkeys()快速实现有序去重:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] combined = a + b unique_list = list(dict.fromkeys(combined)) print(unique_list) # 输出:[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 4, 6, 7, 9, 10, 11, 12]
方法2:手动遍历判断(贴合你原本的思路)
如果想手动实现逐个检查重复的逻辑,需要在遍历过程中直接向new_list添加元素,而不是用列表推导式一次性生成:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] new_list = [] for num in a + b: if num not in new_list: new_list.append(num) print(new_list) # 输出和方法1的有序结果一致
方法3:快速去重(不关心元素顺序)
如果不在意元素的顺序,直接用集合的自动去重特性是最简单的:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] unique_list = list(set(a + b)) print(unique_list) # 输出顺序不确定,但所有元素无重复
内容的提问来源于stack exchange,提问作者Michael Jason Stokes
相关产品推荐
相关产品推荐

