You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何此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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:12:36