Эквивалент для инъекции() в 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])