首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >maps的GROUP BY和Aggregation - Clojure

maps的GROUP BY和Aggregation - Clojure
EN

Stack Overflow用户
提问于 2011-08-26 19:13:17
回答 4查看 2.6K关注 0票数 10

我有如下所示的数据

代码语言:javascript
复制
(def a [{:firmAccount "MSFT" :Val 10  :PE 3 }  
        {:firmAccount "MSFT" :Val 15  :PE 4} 
        {:firmAccount "GOG" :Val 15 :PE 3} 
        {:firmAccount "YAH" :Val 8 :PE 1}])

我想按on :firmAccount分组,然后将每个公司帐户的:Val和:PE相加,得到如下内容

代码语言:javascript
复制
 [{:firmAccount "MSFT" :Val 25 :PE 7}
  {:firmAccount "GOG" :Val 15 :PE 3}    
  {:FirmAccount "YAH" :Val 8 :PE 1}]

这真的是一件微不足道的事情,在SQL中,我甚至不会再多想,但既然我正在学习clojure,请耐心等待

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-26 20:03:52

Clojure.core具有内置的group-by函数。由于地图中同时存在文本和整数,解决方案变得有点丑陋。

代码语言:javascript
复制
(for [m (group-by :firmAccount a)]
   (assoc (apply merge-with + (map #(dissoc % :firmAccount) (val m)))
          :firmAccount (key m)))
票数 8
EN

Stack Overflow用户

发布于 2011-08-28 09:42:39

为了完整起见,这里有一个使用map的替代版本:

代码语言:javascript
复制
(map (fn [[firmAccount vals]] 
   {:firmAccount firmAccount 
    :Val (reduce + (map :Val vals)) 
    :PE (reduce + (map :PE vals))}) 
  (group-by :firmAccount a))
票数 6
EN

Stack Overflow用户

发布于 2011-08-26 19:52:22

尝试创建新的映射数组或具有相同结构的映射的映射。您可以编写一个函数,将元素添加到这个新映射中,如果:firm-account存在,该映射将对这些字段求和。也许是这样的地图?

代码语言:javascript
复制
(def a {"MSFT" {:Val 25  :PE 7 }
        "GOG" {:Val 15 :PE 3} 
        "YAH" {:Val 8 :PE 1}})

具有个性化的添加功能,如:

代码语言:javascript
复制
(add-to-map [element map]
  (if (contains? (find-name element))
    {map (add-fields element (find (find-name element)))}
    {map element}))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7203827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档