Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用映射和过滤器实现此功能?_Python - Fatal编程技术网

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的内置函数编写它。