在clojure中使用映射中的键对元素进行分组
我有一张表格的地图在clojure中使用映射中的键对元素进行分组,clojure,Clojure,我有一张表格的地图 {[3.0 4.0][2.0 7.0][7.0 3.0][4.0 6.0][1.0 4.0][5.0 6.0][4.0 9.0][5.0 11.0][4.0 16.0]} 我想将第二个键分组在特定范围内,如 ((1-5)(6-10)(11-15)..) 结果应该是 {{[3.0 4.0][7.0 3.0][1.0 4.0]} {[2.0 7.0][4.0 6.0][5.0 6.0][4.0 9.0]} {[5.0 11.0][4.0 16.0]}} 我已经用peek实现
{[3.0 4.0][2.0 7.0][7.0 3.0][4.0 6.0][1.0 4.0][5.0 6.0][4.0 9.0][5.0 11.0][4.0 16.0]}
我想将第二个键分组在特定范围内,如
((1-5)(6-10)(11-15)..)
结果应该是
{{[3.0 4.0][7.0 3.0][1.0 4.0]}
{[2.0 7.0][4.0 6.0][5.0 6.0][4.0 9.0]}
{[5.0 11.0][4.0 16.0]}}
我已经用peek实现了,但是失败了。我怎样才能得到这个结果?你把上一个问题的结果弄糊涂了。这个问题的输出(以及这个问题的输入)是一个类似{…}的集合,而不是类似{…}的映射。集合中的每个元素都是一个长度为2的向量,如[3-4] 最简单的解决方案是过滤每个搜索范围,如下所示:
(ns clj.core
(:require [tupelo.core :as t]
[datascript.core :as d]
[clojure.set :as set] ))
(t/refer-tupelo)
(def data
#{ [3.0 4.0] [2.0 7.0] [7.0 3.0] [4.0 6.0] [1.0 4.0] [5.0 6.0] [4.0 9.0] [5.0 11.0] [4.0 16.0] } )
(println "1-5:" (filter #(<= 1 (second %) 5) data))
;=> 1-5: ([3.0 4.0] [1.0 4.0] [7.0 3.0])
您可以提取如下值
(newline)
(pp/pprint (vals result4))
([[3.0 4.0] [1.0 4.0] [7.0 3.0]]
[[4.0 9.0] [2.0 7.0] [4.0 6.0] [5.0 6.0]]
[[5.0 11.0]]
[[4.0 16.0]])
我有点搞不懂你是如何创建这张地图的。地图上的钥匙是什么?我认为一张地图必须有偶数个元素,但你展示的是一张奇数个元素的地图@BobJarvis如果结果具有相同的值会怎么样。例如,(def data#{[3.0 4.0][3.0 4.0][3.0 4.0][2.0 7.0][2.0 7.0][7.0 3.0][4.0 6.0][1.0 4.0][5.0 6.0][4.0 9.0][5.0 11.0][4.0 16.0])集合(使用
{…
语法定义)不能有重复值。你是说向量向量:[[3 4][3 4][3 4][2 7]…][/code>??是的。我实际上首先得到了向量向量的结果。函数group by
将同样适用于向量向量向量向量向量,而不是向量集。请尝试并报告结果。
(def result4 (into (sorted-map)
(group-by #(-> % second dec (quot 5)) data)))
(newline)
(pretty result4)
{0.0 [[3.0 4.0] [1.0 4.0] [7.0 3.0]],
1.0 [[4.0 9.0] [2.0 7.0] [4.0 6.0] [5.0 6.0]],
2.0 [[5.0 11.0]],
3.0 [[4.0 16.0]]}
(newline)
(pp/pprint (vals result4))
([[3.0 4.0] [1.0 4.0] [7.0 3.0]]
[[4.0 9.0] [2.0 7.0] [4.0 6.0] [5.0 6.0]]
[[5.0 11.0]]
[[4.0 16.0]])