Clojure: суммирование значений в коллекции карт - PullRequest
4 голосов
/ 28 октября 2011

Я пытаюсь суммировать значения набора карт по их общим ключам.У меня есть этот фрагмент:

(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)

По сути, у меня есть список карт.Затем я выполняю список понимания, чтобы взять только те ключи, которые мне нужны.

Теперь у меня вопрос: как я могу суммировать эти значения?Я пытался использовать «уменьшить», но он работает только над последовательностями, а не над коллекциями.

Спасибо.

=== РЕДАКТИРОВАТЬ ====

Используя предложение изJoost Я вышел с этим:

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

Это повторяет коллекцию и суммы по выбранным ключам.Часть «ключи выбора», которую я добавил, особенно необходима, чтобы избежать неприятностей, когда карты в коллекции содержат литералы, а не только цифры.

1 Ответ

11 голосов
/ 28 октября 2011

Если вы действительно хотите суммировать значения общих ключей, вы можете выполнить полное преобразование за один шаг:

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

Для суммирования подпоследовательностей, которые у вас есть:

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