【问题标题】:Equivalent for inject() in Python?等效于 Python 中的 inject()?
【发布时间】:2017-01-17 22:29:51
【问题描述】:

在 Ruby 中,我习惯于使用 Enumerable#inject 来遍历列表或其他结构,然后返回一些关于它的结论。例如,

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

判断数组中的每个元素是否都是奇数。在 Python 中完成同样事情的合适方法是什么?

【问题讨论】:

    标签: python functional-programming


    【解决方案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 的值,它将能够逃脱循环,而reduce 解决方案必须处理整个列表才能返回答案。

    【讨论】:

    • 请注意,Python 2 中的内置 reduce() 已移至 Python 3 中的 functools.reduce()
    【解决方案2】:

    听起来像 Python 中的 reduce 或 Haskell 中的 fold(r|l)'?'

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

    【讨论】:

    • 我一直想知道为什么变态在每一种函数语言中都被称为“折叠”,而 Ruby 和 Python 却发明了自己的名字...
    • JavaScript (1.8) 使用reduce,我认为Clojure 也使用reduce,但我可能会误认为后者......我不知道为什么会这样。
    • 这是 Common Lisp 的传统,它的名字是从 APL 借来的。我认为 Ruby 和 Python 对 Lisp 的影响比任何函数式语言都要大。
    • 啊,我忘记了 Lisp;我太习惯于使用严格类型的函数式语言系列......
    【解决方案3】:

    我认为您可能想要使用all,它不如inject 通用。不过,reduce 是 Python 中的 inject 等价物。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2015-08-04
      • 2023-03-26
      相关资源
      最近更新 更多