Clojure:地図のコレクションの値の合計

私は共通のキーでマップのコレクションの値を合計しようとしています。私はこのスニペットを持っています:

(def data [{:a 1 :b 2 :c 3} {:a 1 :b 2 :c 3}]
(for [xs data] (map xs [:a :b]))
((1 2) (1 2))

Final result should be ==> (2 4)

基本的に、私はマップのリストを持っています。それから私は必要なキーだけを取るための理解のリストを実行します。

私の質問は、今私はどのようにこれらの値を合計することができますか?私は "reduce"を使用しようとしましたが、コレクション全体ではなく、シーケンス全体でしか動作しません。

ありがとう。

=== EDIT ====

Joostの提案を使って、私はこれを出しました:

(apply merge-with + (for [x data] (select-keys x [:col0 :col1 :col2]))

これはコレクションを繰り返し、選択したキーを合計します。私が追加した「選択キー」の部分は、特に、コレクション内のマップに数字だけでなくリテラルが含まれている場合に問題になるのを避けるために必要です。

4

1 答え

本当に共通鍵の値を合計する場合は、変換全体を1ステップで実行できます。

(apply merge-with + data)
=> {:a 2, :b 4, :c 6}

あなたが持っているサブシーケンスを合計するには:

(apply map + '((1 2) (1 2)))
=> (2 4)
11
追加された
あなたは数字以外のリテラルを意味しますか?
追加された 著者 Joost Diepenmaat,
merge-withの実装は本当に素晴らしいです。これを特定のキーに適用する方法についての提案もありますか?それ以外の場合は、マップにリテラルがある場合は機能しません。
追加された 著者 kfk,
はい、私は解決策を思いついたと思いますが、私は最初の投稿でそれを書きました。
追加された 著者 kfk,