Clojure中序列中元素的排名

br-*_*-01 -1 clojure sequence seq

我对像这样的元素有一个序列 ([:Jon 326] [:Mary 233] [:Matthew 255])

并希望以一种巧妙的方式将此序列转换为类似 {{:name Jon :rank 1} {:name Matthew :rank 2} {:name Mary :rank 3}}

:name应该是字符串类型,而:rank应该是整数

排名是由数字计算得出的,与序列中元素中的其他元素相比,“点”越高,排名越高

Lee*_*Lee 6

您可以sort-by用来对输入序列进行排序,然后用于map-indexed将其转换为等级:

(def input '([:Jon 326] [:Mary 233] [:Matthew 255]))

(map-indexed (fn [idx p]
               {:name (name (first p))
                :rank (inc idx)})
             (sort-by second > input))
Run Code Online (Sandbox Code Playgroud)

或者您可以使用thread-last宏:

 (->> input 
      (sort-by second >) 
      (map-indexed (fn [idx p] {:name (name (first p)) :rank (inc idx)})))
Run Code Online (Sandbox Code Playgroud)

您也可以将函数中的线对解构为,map-indexed而不是使用first

(->> input 
     (sort-by second >) 
     (map-indexed (fn [idx [n _]] {:name (name n) :rank (inc idx)})))
Run Code Online (Sandbox Code Playgroud)