Как я могу исправить лямбда-линию, чтобы заставить меня работать? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь сделать оператор if внутри лямбды, но подвох в том, что я тоже пытаюсь сделать все нечетные числа третьими тоже, лямбда-строка игнорирует i ** 3,


numbers = range(1,10)

odd_numbers_to_the_third_2 = list(filter(lambda i : i**3 if i%2!=0 else None , numbers))

во второй строке кода я пытаюсь i ** 3, если это нечетное число, но результат показывает нечетные числа, не делая его ** 3 Я получаю [1,3,5,7,9] вместо [1,27,125,343,729]

Ответы [ 5 ]

0 голосов
/ 01 мая 2019

при filter() просто проверяет элементы списка и возвращает значения, которые удовлетворяют условию, вы можете использовать map(), чтобы сделать то, что вы хотите:

  1. этот код:
odd_numbers_to_the_third_2 = list(map(lambda i : i**3 if i%2!=0 else None , numbers))

с этим выводом:

[1, None, 27, None, 125, None, 343, None, 729]
или этот:
odd_numbers_to_the_third_2 = list(map(lambda i : i**3 if i%2!=0 else None , list(filter(lambda i : i%2!=0, numbers ))))

для этого вывода:

[1, 27, 125, 343, 729]
0 голосов
/ 01 мая 2019

filter() фильтрует и не преобразует список. map() для преобразования.

Итак, вы должны сначала отфильтровать все нечетные числа и преобразовать карту:

list(map(lambda x: x ** 3, filter(lambda i: i % 2, numbers)))

В идеале, вы должны использовать списки, которые доказали свою эффективность, чем комбинации map / filter lambda:

[x ** 3 for x in numbers if x % 2]
0 голосов
/ 01 мая 2019

Используйте map, чтобы получить число в кубе, затем отфильтруйте None значения:

odd_numbers_to_the_third_2 = list(filter(bool,map(lambda i : i**3 if i%2!=0 else None, numbers)))

Или используйте выражение генератора, чтобы применить map только к нечетным числам и отбросить остальные:

odd_numbers_to_the_third_2 = list(map(lambda i : i**3, (num for num in numbers if num%2!=0)))

Или не использовать map / filter вообще:

odd_numbers_to_the_third_2 = [num**3 for num in numbers if num%2 != 0]

Вывод всех подходов:

[1, 27, 125, 343, 729]
0 голосов
/ 01 мая 2019

Как упомянуто в комментарии filter не выполняет никакого действительного преобразования, оно просто использует ваш lambda, чтобы решить, что возвращать.

Вместо этого я бы использовал понимание списка с условным:

numbers = range(1,10)
odd_numbers_to_the_third_2 = [i**3 for i in numbers if i%2 != 0]
0 голосов
/ 01 мая 2019

Вы можете использовать понимание:

>>> odd_numbers_to_the_third_2 = [i**3 for i in numbers if i%2 != 0]
>>> odd_numbers_to_the_third_2
[1, 27, 125, 343, 729]

Использование filter и map:

>>> odd_numbers_to_the_third_2 = list(map(lambda x: x**3, filter(lambda x: x%2 != 0, numbers)))
>>> odd_numbers_to_the_third_2
[1, 27, 125, 343, 729]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...