Python中的inject()等价方法是什么?

17

在 Ruby 中,我习惯使用 Enumerable#inject 来遍历列表或其他结构,并得出有关其的一些结论。例如,

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

如何确定数组中的每个元素都是奇数?在Python中,实现同样功能的适当方法是什么?

3个回答

25

要确定每个元素是否为奇数,我会使用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 的值,就可以跳出循环,而reduce解决方法需要处理整个列表才能返回答案。


4
请注意,Python 2 中内置的 reduce() 已经移动到 Python 3 的 functools.reduce() - 200_success

8
听起来像是Python中的reduce或Haskell中的fold(r|l)?
reduce(lambda x, y: x and y % == 1, [1, 3, 5])

我一直想知道为什么在每个函数式语言中,catamorphisms都被称为“fold”,但Ruby和Python却发明了自己的名称... - ephemient
JavaScript(1.8)使用reduce,我认为Clojure也使用reduce,但后者可能有所不同... 但我不知道原因。 - Deniz Dogan
这是Common Lisp的传统,它从APL借用了名称。我认为Ruby和Python比任何函数式语言都更受Lisp的影响。 - Nathan Shively-Sanders
啊,我忘记了 Lisp;我已经太习惯于使用严格类型的函数式语言家族了... - ephemient

4

我认为你可能希望使用all,它比inject更具体。而reduce则是Python中等价于inject的函数。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接