使用map和filter而不是for循环?

时间:2016-09-20 16:46:42

标签: python dictionary filter functional-programming

如何使用地图和过滤器编写以下代码的等效代码?

res = []
for x in range(5):
    if x % 2 == 0:
        for y in range(5):
            if y % 2 == 1:  
                res.append((x, y))

这是预期的结果:

[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

这是我写的代码,但它似乎不起作用:

list( map(( lambda x,y: (x,y)), filter((lambda x: x%2 == 0), range(5)), filter((lambda y: y%2 != 0), range(5))))

4 个答案:

答案 0 :(得分:3)

你可以把它写成(在Python 2.x中):

xs = filter(lambda x: x % 2 == 0, range(5))
ys = filter(lambda y: y % 2 == 1, range(5))
res = [(x, y) for x in xs for y in ys]

这也使用list comprehension

在Python 3.x中:

xs = list(filter(lambda x: x % 2 == 0, range(5)))
ys = list(filter(lambda y: y % 2 == 1, range(5)))
res = [(x, y) for x in xs for y in ys]

答案 1 :(得分:2)

你甚至不需要地图和过滤器,你可以在列表理解中完成整个事情

[(x,y) for x in range(5) for y in range(5) if not x%2 and y%2]

答案 2 :(得分:1)

您需要使用product中的itertools方法,该方法生成输入可迭代的笛卡尔积。

x_arr = [x for x in range(5) if x % 2 == 0]
y_arr = [y for y in range(5) if x % 2 == 1]
from itertools import product
final_arr = product(x_arr, y_arr)

输出为[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

答案 3 :(得分:1)

另一种方法是,您可以使用step的第3 range个参数来捕获奇数或偶数的事实:

>>> sorted((x,y) for y in range(1,5,2) for x in range(0,5,2))
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]