如何使用地图和过滤器编写以下代码的等效代码?
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))))
答案 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)]