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