Я пытаюсь сделать оператор 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 , 27125343729 ]

0
Ben Shimon Asraf 1 Май 2019 в 13:24

5 ответов

Лучший ответ

Так как 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]
  1. или этот:
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
mohammad RaoofNia 1 Май 2019 в 10:44

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

>>> 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]
0
Netwave 1 Май 2019 в 10:35

Используйте 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
glhr 1 Май 2019 в 10:35

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
Austin 1 Май 2019 в 10:45

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

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

numbers = range(1,10)
odd_numbers_to_the_third_2 = [i**3 for i in numbers if i%2 != 0]
0
PyPingu 1 Май 2019 в 10:47