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