2009-07-01 3 views
10

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

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

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

ответ

21

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

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

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

В целом, однако, Руби inject является самым как reduce() Пайтона:

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

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

+4

Обратите внимание, что встроенный 'reduce()' в Python 2 был перемещен в ['functools.reduce()'] (https : //docs.python.org/3.0/library/functools.html#functools.reduce) в Python 3. –

6

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

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

Я всегда задавался вопрос, почему катаморфизм известны как «фолд» с в каждом ** ** функциональном языке, но Руби и Python изобрести свои собственные имена ... – ephemient

+0

JavaScript (1.8) используют сокращения и я думаю, что Clojure использование также уменьшает, но я могу ошибаться в последнем ... Я не знаю, почему это так. –

+0

Это традиция от Common Lisp, которая заимствовала имя от APL. Я думаю, что Ruby и Python имеют гораздо больше влияния Lisp, чем на любой функциональный язык. –

4

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

all(n % 2 == 1 for n in [1, 3, 5, 7]) 
Смежные вопросы