【问题标题】:How to sum all values in a hashmap?如何对哈希图中的所有值求和?
【发布时间】:2016-04-08 06:18:42
【问题描述】:

在 Clojure 中,我有一张这样的地图:

(def data {:a 1 :b 2 :c 3})

我想对所有元素求和并得到6 作为结果。我知道我可能应该使用reduce,但我不知道如何正确使用它。

【问题讨论】:

    标签: clojure hashmap sum reduce


    【解决方案1】:

    你是对的,你应该在这里减少。 vals 将为您提供您想要相加的值,然后只需 reduce 它们通过加法函数即可。

    user=> (def data {:a 1 :b 2 :c 3})
    #'user/data
    user=> (vals data)
    (3 2 1)
    user=> (reduce + (vals data)) 
    6
    

    【讨论】:

      【解决方案2】:

      有两种简单的方法可以做到这一点。

      reduce

      (reduce + (vals data))
      

      或者apply

      (apply + (vals data))
      

      They are equivalent for associative functions.

      我建议apply 更惯用,因为+ is already implemented via reduce

      也就是说,如果我们计算(+ 1 2 3),结果是6。所以很自然地要问为什么(+ (vals data))不够。

      (vals data) 的结果是列表(1 2 3)+ 将其视为单个参数并仅返回该值...哎呀。

      (+ (vals data))
      => (1 2 3)
      

      applyworks by essentially unpacking the list.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多