У меня есть два списка.Например: список A равен [1 2 3 2 2 1]
, а список B равен [1.2 2.2 1 1 1 1]
.Я хочу иметь уникальные номера списка A на оси x и сумму соответствующих записей в списке B. Например: для приведенного выше примера я хочу построить график {(1,2.2), (2,4.2),(3,1)} как гистограмма (не точечная диаграмма).
Мое требование состоит из двух шагов.
- Сначала суммируем значения в списке B для каждого уникального значения в спискеA
- Построение этих сумм против соответствующих значений в списке A в виде гистограммы.
Можете ли вы помочь мне.
Редактировать: Вот моя попытка, основанная на немногом, что я мог понять, прочитав другие ответы на SO:
(def A [1 2 3 2 1])
(def B [1.2 2.3 2 1 1])
(for [x (distinct A)] (map first
(filter #(= (second %) x)
(map-indexed vector A))))
;; This gives the indices for each unique element in A
;; In this case, it gives ((0 4) (1 3) (2))
Я не могу понять, как найти соответствующую суммуиз списка Б. Я попробовал следующее, но это не работает.
(apply nth B (map first
(filter #(= (second %) 1)
(map-indexed vector A))) )
;; In this case, it gives on the first element i.e. 1.2
Как видите, я новичок в Clojure и функциональных языках программирования.Не могли бы вы указать мне на некоторые примеры, которые решили аналогичные проблемы?
Заранее спасибо.
Редактировать: Окончательное решение для первой задачи:
(for [x (distinct A)] (reduce + 0.0 (map #(nth B %) (map first
(filter #(= (second %) x)
(map-indexed vector A))) ) ) )
;; This gives me the correct output (2.2 3.3 2.0)
PS: Я не понял эту концепцию использования (map #(nth B%)..
.Я просто наткнулся на это из других примеров.