Вектор обработки карт в Clojure - PullRequest
17 голосов
/ 13 августа 2011

Я не нашел много документации или примеров кодирования для манипуляций с векторами карт.Например, если у меня есть

(def student-grades 
 [{:name "Billy" :test1 74 :test2 93 :test3 89} 
  {:name "Miguel" :test1 57 :test2 79 :test3 85}
  {:name "Sandy" :test1 86 :test2 97 :test3 99}
  {:name "Dhruv" :test1 84 :test2 89 :test3 94}])

, и я хочу добавить или связать новую пару значений ключа для средних значений теста, на какие функции мне следует читать?Также, если кто-нибудь знает какие-либо ссылки / ресурсы для векторов карт в Clojure, пожалуйста, поделитесь!Большое спасибо!

Ответы [ 2 ]

11 голосов
/ 13 августа 2011

В этом случае вы хотите отобразить функцию над коллекцией (которая просто оказывается вектором);для каждого элемента в коллекции (который является картой - неудачное именование там), вы хотите сгенерировать новую карту, которая имеет все пары ключ-значение старой карты, плюс новый ключ, скажем, : avg .

например,

(into [] ; optional -- places the answer into another vector
  (map   ; apply the given function to every element in the collection
    (fn [sg] ; the function takes a student-grade
      (assoc sg ; and with this student-grade, creates a new mapping
        :avg    ; with an added key called :avg
        (/ (+ (:test1 sg) (:test2 sg) (:test3 sg)) 3.0)))
    student-grades  ; and the function is applied to your student-grades vector
))

ps , который вы можете использовать (doc fn-name) для получения документации по нему;если вы новичок в Clojure, я бы посоветовал потусоваться с дружелюбными людьми на irc.freenode.net #clojure и почитать книгу - мой любимый в настоящее время Программирование Clojure , но я жду O'Предстоящая книга Рейджи Clojure, затаив дыхание.

5 голосов
/ 15 августа 2011

Hircus уже дал хороший ответ, но вот еще одна реализация для сравнения:

(defn average [nums]
  (double (/ (apply + nums) (count nums))))

(map 
  #(assoc % :avg (average ((juxt :test1 :test2 :test3) %)))
  student-grades)

=> ({:avg 85.33333333333333, :name "Billy", :test1 74, :test2 93, :test3 89} etc....)

Комментарии к сведению:

  • Обычно стоит выделить такие общие функции, как "«усреднение» в отдельную, хорошо названную функцию
  • juxt - довольно полезная функция для извлечения конкретного списка значений компонентов из карты
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...