2011-10-28 8 views
4

マップのコレクションの値を共通キーで集計しようとしています。私はこのスニペットを持っています: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"を使用しようとしましたが、コレクション全体ではなく、シーケンス全体でしか動作しません。

ありがとうございました。

===ヨーストからの提案を使用して編集する====

私はこれで出てきた:

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

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

答えて

11

あなたは本当に一般的なキーの値を合計したい場合は、ワンステップで全体の変換を行うことができます。

(apply map + '((1 2) (1 2))) 
=> (2 4) 
+0

実装と:

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

あなたが持っているサブシーケンスを合計しますmerge-withは本当にクールです。これを特定のキーに適用する方法についての提案もありますか?それ以外の場合は、マップにリテラルがある場合は機能しません。 – kfk

+0

あなたは数字以外のリテラルを意味しますか? –

+0

はい、私は解決策を思いついたと思います。私は最初の投稿でそれを書いています。 – kfk