Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Equivalent for inject() in Python?

In Ruby, I'm used to using Enumerable#inject for going through a list or other structure and coming back with some conclusion about it. For example,

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

to determine if every element in the array is odd. What would be the appropriate way to accomplish the same thing in Python?

like image 818
wolak Avatar asked Jul 01 '09 19:07

wolak


3 Answers

To determine if every element is odd, I'd use all()

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

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

In general, however, Ruby's inject is most like Python's reduce():

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

all() is preferred in this case because it will be able to escape the loop once it finds a False-like value, whereas the reduce solution would have to process the entire list to return an answer.

like image 86
Kenan Banks Avatar answered Nov 11 '22 03:11

Kenan Banks


Sounds like reduce in Python or fold(r|l)'?' from Haskell.

reduce(lambda x, y: x and y % == 1, [1, 3, 5])
like image 8
Deniz Dogan Avatar answered Nov 11 '22 03:11

Deniz Dogan


I think you probably want to use all, which is less general than inject. reduce is the Python equivalent of inject, though.

all(n % 2 == 1 for n in [1, 3, 5, 7])
like image 4
Nathan Shively-Sanders Avatar answered Nov 11 '22 04:11

Nathan Shively-Sanders