Помогите разобраться с lambda python
Значит есть такой массив данных и нужно: 'Определите количество пар элементов, из которых оба числа нечётные, а также максимальную сумму элементов таких пар'. Решая не выпендриваясь, то есть так:
arr = []
data = [8, 10, 3, 19, 20]
for i in range(len(data) - 1):
if data[i] % 2 != 0 and data[i + 1] % 2 != 0:
arr.append(data[i] + data[i + 1])
print(len(arr), max(arr))
Ответ 1, 22 и он верный. Но я решил поэкспериментировать и решить по другому, то есть так:
arr = []
data = [8, 10, 3, 19, 20]
for i in range(len(data) - 1):
if all(lambda x: x % 2 != 0 for x in [data[i], data[i + 1]]):
arr.append(data[i] + data[i + 1])
print(len(arr), max(arr))
Ответ 4, 39 - неверный. Он почему-то игнорирует мою функцию и добавляет все. Однако если вынести функцию, то есть так:
def f(x):
return True if x % 2 != 0 else False
arr = []
data = [8, 10, 3, 19, 20]
for i in range(len(data) - 1):
if all(f(x) for x in [data[i], data[i + 1]]):
arr.append(data[i] + data[i + 1])
print(len(arr), max(arr))
Ответ 1, 22 и все хорошо. Помогите разобраться, что не так я делаю с lambda
Ответы (2 шт):
Lambda тут не к месту. Она должна быть краткой формой заменяемой функции (эквивалентна ей). Она же возвращает значение х в вашем случае (lambda x), а не True или False, как эквивалентная функция. Х же всегда True у вас, согласно правилам языка.
lambda - это ссылка на функцию. Вы проверяете тут через all не значение выполненной функции, а просто что у вас там что-то не пустое. Ну, lambda - это что-то не пустое, да, поэтому оно всегда True. Для того, чтобы всё отработало правильно, вам эту лямбду надо выполнить как функцию, передав ей аргументы. Например, так:
if all(map(lambda x: x % 2 != 0, [data[i], data[i + 1]])):
Или так:
if all((lambda x: x % 2 != 0)(x) for x in [data[i], data[i + 1]]):
Имейте в виду, что x как аргумент lambda не имеет никакого отношения к переменной цикла x, это внутренняя переменная самой lambda, там можно любую другую букву написать. Собственно, ещё и поэтому lambda ничего не знает об итерациях цикла и переменной цикла, пока ей эту переменную явно не передадут как аргумент.