Python只使用filter和lamb删除列表中的重复项

2024-04-18 22:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在没有集合、函数或循环的列表中删除重复项—只需要使用filter和lambda函数。在

我的尝试是:

list(filter(lambda x: x in l[:].remove(x), l))

但是remove返回移除的项,而不是整个列表。有什么建议吗?在


Tags: lambda函数in列表filter建议removelist
2条回答

你需要保持某种状态。如果可以使用新列表,可以执行以下操作:

g = l[:]
filter(lambda x: g.remove(x) is None and g.count(x) == 0, l)

上面的方法以不同的方式删除重复项。如果有l = [1, 2, 2, 3, 2],那么结果列表是{}。在

或者创建一个空列表并使用它来跟踪您看到的内容:

^{pr2}$

以上两种方法都非常类似于使用集合,尽管效率要低得多。:-)并且两者都使用了一种傻瓜机制来允许对列表进行适当的变异,但是返回一个真/假结果(它们中的is None部分允许我们将表达式链接在一起)。在

如果您可以使用mapenumerate,可以执行以下操作:

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代码,除了reduce版本,尽管它没有性能。在

我只使用了一个lambda函数来解决这个问题。在

以下lambda函数返回与作为参数传递的列表相对应的列表,没有重复项:

lambda l: (lambda u, a: u(u, a)) ((lambda f, x: x if len(x) <= 1 else (f(f, x[1:]) if x[0] in x[1:] else ([x[0]] + f(f, x[1:])))), l)

由于目标有点不同,我发布了一个单独的Q/a,在这里我解释了这一点:Removing duplicates using only lambda functions。在

相关问题 更多 >