clojure - 在clojure中对序列中的元素进行排名
问题描述
我有一个关于元素的序列
([:Jon 326] [:Mary 233] [:Matthew 255])
并想以一种巧妙的方式将这个序列转换成类似于地图的东西
{{:name Jon :rank 1} {:name Matthew :rank 2} {:name Mary :rank 3}}
:name 应该是一个字符串类型和 :rank 一个整数
排名由数字计算,与序列中元素中的其他元素相比,“点”越高,排名越高
解决方案
您可以使用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))
或者您可以使用最后线程宏:
(->> input
(sort-by second >)
(map-indexed (fn [idx p] {:name (name (first p)) :rank (inc idx)})))
您还可以将函数中的对解构为map-indexed
而不是使用first
:
(->> input
(sort-by second >)
(map-indexed (fn [idx [n _]] {:name (name n) :rank (inc idx)})))
推荐阅读
- python - 递归列表到字典
- c - 当 IFS 设置为某个值时,如何将新行传递给 argv 参数,命令输出在这里执行的方式?
- java - HashCode 不被 Equals 解释调用
- sql - 如何在 Teradata 中将这两列合并为一个时间戳?谢谢
- javascript - javascript变量到php然后到数据库
- node.js - 当我尝试使用 readline-sync 向用户询问答案时出错
- html - flex 动态布局
- python - 换行参数未按预期工作
- kotlin - 将 VSCode 扩展转换为 Intellij 插件问题
- visual-studio-code - 新更新后我的 Vscode 似乎有问题