2009-07-01 12 views
10

In Ruby, ich bin zu verwenden Enumerable # für das Gehen durch eine Liste oder eine andere Struktur und kommt zurück mit einem gewissen Abschluss darüber injizieren verwendet. Zum BeispielÄquivalent für inject() in Python?

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

um festzustellen, ob jedes Element im Array ungerade ist. Was wäre der geeignete Weg, um dasselbe in Python zu erreichen?

Antwort

21

Um zu bestimmen, ob jedes Element ungerade ist, würde ich all()

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

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

Im Allgemeinen verwenden jedoch Rubin inject der am ähnlichsten ist reduce() Python:

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

all() bevorzugt wird in diesem Fall, weil es in der Lage sein, die Schleife zu entkommen, sobald es einen False -ähnlichen Wert findet, während die reduce Lösung müsste die gesamte Liste verarbeiten, um eine Antwort zurückzugeben.

+4

Beachten Sie, dass das eingebaute 'reduce()' in Python 2 nach ['functools.reduce()'] (https : //docs.python.org/3.0/library/functools.html#functools.reduce) in Python 3. –

6

Klingt wie reduce in Python oder fold(r|l)'?' von Haskell.

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

Ich habe mich immer gefragt, warum catamorphisms sind bekannt als „fold“ s in ** ** jede funktionale Sprache, aber Ruby und Python ihre eigenen Namen erfinden ... – ephemient

+0

JavaScript (1.8) verwendet reduzieren und ich denke, Clojure Gebrauch reduziert auch, aber ich mag mich auf letzterem irren ... Ich weiß nicht, warum das so ist. –

+0

Dies ist Tradition von Common Lisp, die den Namen von APL entlehnt. Ich denke, Ruby und Python haben viel mehr Lisp-Einfluss als aus jeder anderen funktionalen Sprache. –

4

Ich denke, dass Sie wahrscheinlich all verwenden möchten, die weniger allgemein als inject ist. reduce ist der Python Äquivalent inject, though.

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