Clojure - 如何引用列表中的元素

时间:2013-11-13 19:52:13

标签: clojure keyword min

我想知道如何引用我已经分区的一系列列表中的最小元素:

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)]

我想引用每个列表中的最小数字,例如在上面的列表中,我将为a返回数字33,为b返回25,依此类推。 我会假设我可以引用该关键字,然后使用apply max但我收到此错误的错误:

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

任何帮助都非常感谢!

3 个答案:

答案 0 :(得分:1)

您的代码看起来并不像有效的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}

答案 1 :(得分:0)

从上一个结果值[: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

答案 2 :(得分:0)

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),那么您提供给我们的代码也会正常工作。