您需要以某种方式保持一些状态.如果可以使用新列表,则可以执行以下操作:
g = l[:]
filter(lambda x: g.remove(x) is None and g.count(x) == 0, l)
上面删除重复项的方式有所不同.如果l = [1、2、2、3、2],则最终结果为[1、3、2].
或创建一个空列表并使用它来跟踪您所看到的内容:
seen = []
return filter(lambda x: seen.append(x) is None if x not in seen else False, l)
上面两种都与使用集合非常相似,尽管效率要低得多. :-)两者都使用愚蠢的机制允许对列表进行适当的更改,但返回True / False结果(两者中的None部分均允许我们将表达式链接在一起).
如果可以使用map和enumerate,则可以执行以下操作:
map(lambda t: t[1],
filter(lambda t: l[:t[0]].count(t[1]) == 0, enumerate(l)))
(它使用当前索引查看列表的前一部分以查找重复项)
如果可以使用列表推导,则可以删除对map的使用:
[x for i, x in filter(lambda t: l[:t[0]].count(t[1]) == 0,
enumerate(l))]
如果可以使用reduce,则可以执行以下操作:
reduce(lambda r, x: r + [x] if x not in r else r, l, [])
因为您可以通过将结果从一个迭代传递到下一个迭代来保持状态.
但是无论如何,您将需要记录所见内容.尽管没有简化的版本,但这些都不是我所谓的优雅的Python代码-尽管它没有性能.