Помогите разобраться с 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 у вас, согласно правилам языка.

→ Ссылка
Автор решения: CrazyElf

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 ничего не знает об итерациях цикла и переменной цикла, пока ей эту переменную явно не передадут как аргумент.

→ Ссылка