Составление двух списков в Clojure - PullRequest
0 голосов
/ 02 октября 2018

У меня есть два списка.Например: список 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)} как гистограмма (не точечная диаграмма).

Мое требование состоит из двух шагов.

  1. Сначала суммируем значения в списке B для каждого уникального значения в спискеA
  2. Построение этих сумм против соответствующих значений в списке 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%)...Я просто наткнулся на это из других примеров.

1 Ответ

0 голосов
/ 02 октября 2018

Для первой задачи, я думаю, этот способ немного проще:

(def A [1 2 3 2  2 1])
(def B [1.2 2.2 1 1 1 1])
(def C
  (reduce (partial merge-with +)
          (map hash-map A B))) ; Vector of key-values [{1 1.2} {2 2.2} ...]
; {1 2.2, 2 4.2, 3 1}

Для второй задачи существует множество опций библиотеки графиков.Я взял clj-xchart в качестве примера:

(require '[com.hypirion.clj-xchart :as c])

(let [x-values (keys C)
      min-x (apply min x-values)
      max-x (apply max x-values)]
  (c/view
    (c/category-chart
      {"C" C}
      {:title "Example"
       :legend {:visible? false}
       :x-axis {:order (range min-x max-x)}
       :theme :ggplot2})))

И окончательный сюжет:

Chart example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...