【发布时间】:2012-05-19 22:21:07
【问题描述】:
如何使用列表推导从列表中删除重复项?我有以下代码:
a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
b = []
b = [item for item in a if item not in b]
但它不起作用,只会产生相同的列表。为什么它会产生一个相同的列表?
【问题讨论】:
-
因为在您执行
if item not in b时b是空的。列表推导在内存中完成,最后将结果分配给b。 -
这意味着列表理解不像循环那样工作?
-
如果您不想使用集合,因为您想保留顺序,请查看itertools recipes 中的
unique_everseen迭代器。像这样使用:b = list(unique_everseen(a)) -
这是一种循环,但它会一次性生成结果……这也不足为奇。每当您有表达式
x = y时,首先评估y,然后将结果分配给x。但是在评估y时,x不会被修改。如果换成b = list(item for item in a if item not in b),你会有同样的疑问吗?