5,907
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
刚刚接触Python,有个关于列表去重的问题想不明白,我想要用列表推导式对列表去重,示例如下
a = [-1, 1, 2, 3, 2, 1] b=[] b=[i for i in a if i not in b] print(b) 按照我自己的理解,理论上当第2个重复值(例如最后一个1)出现的时候,应该不符合not in b的原则(因为之前已经出现过了),而应该实现去重,但是run出来结果是和a 列表一样,没有任何变化,想不通,请大佬带飞,帮忙解释下,谢谢!
CodeWithMe解释得很详细
帮忙解决wenti
[i for i in a if i not in b] 这里的b是空列表
等价于
[i for i in a if True]
借助chatgpt回答楼主问题。
您的代码试图创建一个列表 b
,其中包含列表 a
中的元素,但每个元素只出现一次。但是,您的方法有一个小问题。在列表推导式中,您检查 i
是否不在 b
中,但在第一次迭代时,b
是一个空列表,因此 i not in b
总是为真。这会导致 b
简单地复制了 a
的所有元素,而不是去除重复项。
为了修复这个问题,您可以使用集合(set)来快速去除重复项,因为集合中的元素是唯一的。然后,您可以将集合转回列表(如果需要)。以下是修复后的代码:
a = [-1, 1, 2, 3, 2, 1]
b = list(set(a)) # 使用集合去除重复项,然后转回列表
print(b)
但是,请注意,使用集合会丢失原始列表中元素的顺序。如果您想保持原始顺序并去除重复项,您可以使用一个稍微不同的方法,比如使用 dict.fromkeys()
方法(这也利用了字典键的唯一性),或者使用一个循环和一个额外的集合来跟踪已经看到的元素:
a = [-1, 1, 2, 3, 2, 1]
b = list(dict.fromkeys(a)) # 使用字典键的唯一性保持顺序并去除重复项
print(b)
或者:
a = [-1, 1, 2, 3, 2, 1]
seen = set()
b = [i for i in a if i not in seen and not seen.add(i)]
print(b)
但是,请注意,seen.add(i)
总是返回 None
,因此它不能直接在列表推导式的条件表达式中使用。上面的代码实际上会抛出一个错误,因为它试图在条件表达式中评估 not seen.add(i)
,这总是 True
(因为 not None
是 True
),但它也修改了 seen
。要修复这个问题,您需要将 not seen.add(i)
从条件表达式中移除,只保留 i not in seen
,并在列表推导式之后添加元素到 seen
。但这样做会稍微复杂一些,不如使用 dict.fromkeys()
方法简洁。