2016-09-20 2 views
0

Как написать эквивалент кода ниже с помощью карты и фильтра?Используйте карту и фильтр вместо цикла for?

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

Сопоставляя ваш Соблюдайте два подхода, помните, что [читаемость считается] (https://www.python.org/dev/peps/pep-0020/). – Phillip

+0

Спасибо. Я буду помнить об этом. Я просто хотел лучше понять карту и фильтр. :) – Taiwosam

ответ

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] 
+0

Это дает '[(0, 1), (0, 3)]' в 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) для x в xs для y в ys] ' – Taiwosam

+0

@Taiwosam: спасибо за ваш комментарий. Я обновил ответ, чтобы дать понять другим. –

2

Вам даже не нужно карту и фильтр, вы могли бы сделать все это в списке понимание

[(x,y) for x in range(5) for y in range(5) if not x%2 and y%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)]

1

Альтернатива, вы можете использовать тот факт, что нечетные или даже числа могут быть захвачены с помощью 3-го step аргумента 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)] 
Смежные вопросы