请路过的大佬帮忙看下这个列表推导式语句为什么行不通

Clare09 2024-06-29 21:53:40

刚刚接触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 列表一样,没有任何变化,想不通,请大佬带飞,帮忙解释下,谢谢!
...全文
258 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

CodeWithMe解释得很详细

GA6401 07-29
  • 打赏
  • 举报
回复

帮忙解决wenti

  • 打赏
  • 举报
回复

[i for i in a if i not in b] 这里的b是空列表
等价于
[i for i in a if True]
CodeWithMe 06-30
  • 打赏
  • 举报
回复

借助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 NoneTrue),但它也修改了 seen。要修复这个问题,您需要将 not seen.add(i) 从条件表达式中移除,只保留 i not in seen,并在列表推导式之后添加元素到 seen。但这样做会稍微复杂一些,不如使用 dict.fromkeys() 方法简洁。

5,907

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用python
社区管理员
  • Python 学习者
  • 嗨学编程
  • 松鼠爱吃饼干
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎来到Python学习者们的社区,

 

本社区分享你需要的文章、问题解答、技术互助、学习资源、面试系列等等

 

欢迎你的加入,祝你学有所成~

试试用AI创作助手写篇文章吧