Python 如何使用映射和过滤器实现此功能?
如何使用Python 如何使用映射和过滤器实现此功能?,python,Python,如何使用map和filter编写语句,以获得与此列表理解表达式相同的结果: [(x,y) for x in range(10) if x%5==0 for y in range(10) if y%5==1] 结果: [(0, 1), (0, 6), (5, 1), (5, 6)] 我知道这似乎毫无意义,但我真的很好奇我就是这样做的,没有压缩: sum(map(lambda x: map(lambda y: (x,y), filter(lambda y: y%5==1,range(10)))
map
和filter
编写语句,以获得与此列表理解表达式相同的结果:
[(x,y) for x in range(10) if x%5==0
for y in range(10) if y%5==1]
结果:
[(0, 1), (0, 6), (5, 1), (5, 6)]
我知道这似乎毫无意义,但我真的很好奇我就是这样做的,没有压缩:
sum(map(lambda x: map(lambda y: (x,y), filter(lambda y: y%5==1,range(10))), filter(lambda x: x%5==0,range(10))),[])
执行:
>>> sum(map(lambda x: map(lambda y: (x,y), filter(lambda y: y%5==1,range(10))), filter(lambda x: x%5==0,range(10))),[])
[(0, 1), (0, 6), (5, 1), (5, 6)]
最后一个,也是(可能)令人讨厌的伎俩是使用sum来压平列表。我得到了[[(0,1),(0,6)],[(5,1),(5,6)]根据对其他答案之一的评论判断,你想要这个的笛卡尔积部分-也就是说,这一点:
[(x,y) for x in range(10) for y in range(10)]
也可以使用map
和filter
完成。这是不可能的。map
的输出包含的元素数与您输入的iterable元素数完全相同。过滤器的输出长度不超过输入的长度。笛卡尔积的长度是输入长度的乘积,映射和过滤器的组合都无法给出
要进行笛卡尔乘积部分,需要某种嵌套循环。您可以自己写出来,就像您在列表理解中所做的那样,也可以使用itertools.product
:
product(range(10), range(10))
在这之后,您只需要两个filter应用程序-要直接从listcomp转换为map/filter,您需要为listcomp的每个if部分应用一个filter。ifs附加到每个变量迭代,而不是结果,因此您将它们放在product的每个参数周围-这也避免了创造性地嵌套它们。最后,我们需要通过list
传递它,因为product
提供了一个迭代器
看起来是这样的:
list(product(filter(lambda x: (x%5 == 0), range(10)), filter(lambda y: (y % 5 == 1), range(10))))
我的眼睛有点紧张:)。请注意,这种求和“技巧”在实践中是一个非常糟糕的主意——它必须构建每个中间累积列表,最终需要二次时间。使用itertools.chain:list(itertools.chain.from_iterable(..))
,可以在线性时间内完成同样的操作,并且可以大大减少内存。实际上,最初的压缩是最好的解决方案,但挑战在于使用python的内置函数编写它。