Clojure - как сделать ссылку на элемент в списке

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

data(map(keyword :counter)querieddata)
sortedlist(sort > tosort)
part(into [] (partition-all (/ (count data) 10) sortedlist))
zi(zipmap [:a :b :c :d :e :f :g :h :i] part)

что дает мне результаты, такие как:

[:a(40 40 36 33) :b(33 30 27 25) :c(25 19 18 5)]

Я хочу сделать ссылку на наименьшее число в каждом списке, как, например, в приведенных выше списках, мне бы вернули число 33 для a, 25 для b и так далее. Я предположил бы, что мог бы сделать ссылку на ключевое слово и затем использовать apply max, но получаю ошибку с этим кодом:

a(map(keyword :a)zi)    
minimum(apply min a)

Любая помощь очень ценится!

3 ответа

Решение

Применять min каждому элементу в part а потом zipmap результат, как вы сделали для zi:

smallest-numbers (map (partial apply min) part)
smallest-numbers-zipped (zipmap [:a :b :c :d :e :f :g :h :i] smallest-numbers)

Кроме того, нет необходимости принуждать part к вектору, если только это не требуется специально для того, чтобы быть вектором в другом месте. Код, который вы дали нам, будет работать так же хорошо, если part определяется как (partition-all (/ (count data) 10) sortedlist),

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

(into {}
  (map (fn [[k v]]
         [k (apply max v)])
       {:a '(40 40 36 33)
        :b '(33 30 27 25)
        :c '(25 19 18 5)}))
; => {:a 40, :c 25, :b 33}

Начиная с вашего последнего значения результата [:a(40 40 36 33) :b(33 30 27 25) :c(25 19 18 5)] Вы можете использовать следующую функцию:

(def your-result '[:a(40 40 36 33) :b(33 30 27 25) :c(25 19 18 5)])
(->> (map vec (partition 2 your-result))
     (map #(vector (first %) (apply min (second %))))
     (into {})
     )

Чтобы получить этот вывод

{:a 33 :b 25 :c 5}

И тогда вы можете использовать ваши ключевые слова как:

(:a (->> (map vec (partition 2 your-result))
      (map #(vector (first %) (apply min (second %))))
      (into {})
      ))

=> 33

Другие вопросы по тегам