我有如下所示的数据
(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相加,得到如下内容
[{:firmAccount "MSFT" :Val 25 :PE 7}
{:firmAccount "GOG" :Val 15 :PE 3}
{:FirmAccount "YAH" :Val 8 :PE 1}]这真的是一件微不足道的事情,在SQL中,我甚至不会再多想,但既然我正在学习clojure,请耐心等待
发布于 2011-08-26 20:03:52
Clojure.core具有内置的group-by函数。由于地图中同时存在文本和整数,解决方案变得有点丑陋。
(for [m (group-by :firmAccount a)]
(assoc (apply merge-with + (map #(dissoc % :firmAccount) (val m)))
:firmAccount (key m)))发布于 2011-08-28 09:42:39
为了完整起见,这里有一个使用map的替代版本:
(map (fn [[firmAccount vals]]
{:firmAccount firmAccount
:Val (reduce + (map :Val vals))
:PE (reduce + (map :PE vals))})
(group-by :firmAccount a))发布于 2011-08-26 19:52:22
尝试创建新的映射数组或具有相同结构的映射的映射。您可以编写一个函数,将元素添加到这个新映射中,如果:firm-account存在,该映射将对这些字段求和。也许是这样的地图?
(def a {"MSFT" {:Val 25 :PE 7 }
"GOG" {:Val 15 :PE 3}
"YAH" {:Val 8 :PE 1}})具有个性化的添加功能,如:
(add-to-map [element map]
(if (contains? (find-name element))
{map (add-fields element (find (find-name element)))}
{map element}))https://stackoverflow.com/questions/7203827
复制相似问题