2024-04-18 22:26:38 发布
网友
我需要在没有集合、函数或循环的列表中删除重复项—只需要使用filter和lambda函数。在
我的尝试是:
list(filter(lambda x: x in l[:].remove(x), l))
但是remove返回移除的项,而不是整个列表。有什么建议吗?在
你需要保持某种状态。如果可以使用新列表,可以执行以下操作:
g = l[:] filter(lambda x: g.remove(x) is None and g.count(x) == 0, l)
上面的方法以不同的方式删除重复项。如果有l = [1, 2, 2, 3, 2],那么结果列表是{}。在
l = [1, 2, 2, 3, 2]
或者创建一个空列表并使用它来跟踪您看到的内容:
以上两种方法都非常类似于使用集合,尽管效率要低得多。:-)并且两者都使用了一种傻瓜机制来允许对列表进行适当的变异,但是返回一个真/假结果(它们中的is None部分允许我们将表达式链接在一起)。在
is None
如果您可以使用map和enumerate,可以执行以下操作:
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
reduce(lambda r, x: r + [x] if x not in r else r, l, [])
因为您可以通过将结果从一个迭代传递到下一个迭代来保持状态。在
但不知怎么的,你需要有一个记录所看到的。这些都不是我所说的优雅的Python代码,除了reduce版本,尽管它没有性能。在
我只使用了一个lambda函数来解决这个问题。在
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。在
你需要保持某种状态。如果可以使用新列表,可以执行以下操作:
上面的方法以不同的方式删除重复项。如果有}。在
l = [1, 2, 2, 3, 2]
,那么结果列表是{或者创建一个空列表并使用它来跟踪您看到的内容:
^{pr2}$以上两种方法都非常类似于使用集合,尽管效率要低得多。:-)并且两者都使用了一种傻瓜机制来允许对列表进行适当的变异,但是返回一个真/假结果(它们中的
is None
部分允许我们将表达式链接在一起)。在如果您可以使用
map
和enumerate
,可以执行以下操作:(它使用当前索引查看列表的前一部分以查找重复项)
如果可以使用列表理解,则可以删除
map
:如果您可以使用
reduce
,那么您可以执行以下操作:因为您可以通过将结果从一个迭代传递到下一个迭代来保持状态。在
但不知怎么的,你需要有一个记录所看到的。这些都不是我所说的优雅的Python代码,除了
reduce
版本,尽管它没有性能。在我只使用了一个
lambda
函数来解决这个问题。在以下
lambda
函数返回与作为参数传递的列表相对应的列表,没有重复项:由于目标有点不同,我发布了一个单独的Q/a,在这里我解释了这一点:Removing duplicates using only lambda functions。在
相关问题 更多 >
编程相关推荐