使用带有“if”的列表理解来创建不重复的项目列表

Huy*_*ang 5 python list-comprehension

我有一个清单word_list = ['cat', 'dog', 'rabbit']。我想使用列表理解来打印列表中的每个单独字符,但删除任何重复的字符。这是我的代码:

word_list = ['cat', 'dog', 'rabbit']
letter_list = [""]
letter_list = [letter for word in word_list for letter in word if letter not in letter_list ]
print(letter_list)
Run Code Online (Sandbox Code Playgroud)

这返回的['c', 'a', 't', 'd', 'o', 'g', 'r', 'a', 'b', 'b', 'i', 't']结果不是期望的结果['c', 'a', 't', 'd', 'o', 'g', 'r', 'b', 'i'],我不明白为什么。

blh*_*ing 4

如果允许初始化某些变量,那么在技术上可以通过列表理解来实现重复数据删除。

\n

您可以使用一个集合seen来跟踪已经遇到的字母,并使用一个集合include来记录当前字母在添加到集合之前是否已经见过seen

\n
seen = set()\ninclude = set()\nprint([\n    letter for word in word_list for letter in word\n    if (\n        include.clear() if letter in seen else include.add(1),\n        seen.add(letter)\n    ) and include\n])\n
Run Code Online (Sandbox Code Playgroud)\n

从 Python 3.8 开始,您还可以使用赋值表达式来避免依赖函数的副作用,这在列表理解中通常不鼓励:

\n
seen = set()\nprint([\n    letter for word in word_list for letter in word\n    if (\n        include := letter not in seen,\n        seen := seen | {letter}\n    ) and include\n])\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果您不打算使用列表理解来实现重复数据删除,那么使用该dict.fromkeys方法会更干净,因为自 Python 3.7 以来 dict 键始终是唯一的并且遵循插入顺序:

\n
from itertools import chain\nprint([*{}.fromkeys(chain(*word_list))])\n
Run Code Online (Sandbox Code Playgroud)\n

演示:在线尝试!

\n