Эквивалент для инъекции() в Python?

В Ruby я использую Enumerable # inject для перехода через список или другую структуру и возвращаюсь с некоторым заключением об этом. Например,

[1,3,5,7].inject(true) {|allOdd, n| allOdd && n % 2 == 1}

чтобы определить, является ли каждый элемент в массиве нечетным. Каким будет подходящий способ выполнить одно и то же в Python?

Ответ 1

Чтобы определить, является ли каждый элемент нечетным, я бы использовал all()

def is_odd(x): 
    return x%2==1

result = all(is_odd(x) for x in [1,3,5,7])

В общем, Ruby inject больше похож на Python reduce():

result = reduce(lambda x,y: x and y%2==1, [1,3,5,7], True)

all() является предпочтительным в этом случае, потому что он сможет выйти из цикла, как только он найдет значение False -like, тогда как решение reduce должно обработать весь список, чтобы вернуть ответ.

Ответ 2

Звучит как reduce в Python или fold(r|l)'?' из Haskell.

reduce(lambda x, y: x and y % == 1, [1, 3, 5])

Ответ 3

Я думаю, вы, вероятно, захотите использовать all, который менее общий, чем inject. reduce является эквивалентом Python inject.

all(n % 2 == 1 for n in [1, 3, 5, 7])