使用clojure对不同范围的向量进行分组
我有一个向量列表,也有重复的值使用clojure对不同范围的向量进行分组,clojure,Clojure,我有一个向量列表,也有重复的值 ([2.0 3.0] [2.0 4.0] [2.0 4.0] [2.0 12.0] [2.0 23.0] [2.0 6.0] [2.0 8.0] [1.0 5.0]p [1.0 9.0] [2.0 8.0] [2.0 16.0] [2.0 19.0] [2.0 13.0] [2.0 18.0] [1.0 23.0] [2.0 24.0] [2.0 22.0] [2.0 33.0] [2.0 27.0] [1.0 29.0] [2.0 32.0] [1.0
([2.0 3.0] [2.0 4.0] [2.0 4.0] [2.0 12.0] [2.0 23.0] [2.0 6.0] [2.0 8.0]
[1.0 5.0]p [1.0 9.0] [2.0 8.0] [2.0 16.0] [2.0 19.0] [2.0 13.0]
[2.0 18.0] [1.0 23.0] [2.0 24.0] [2.0 22.0] [2.0 33.0] [2.0 27.0]
[1.0 29.0] [2.0 32.0] [1.0 35.0] [2.0 39.0])
(([2.0 3.0] [2.0 3.0] [2.0 4.0] [2.0 4.0] [1.0 5.0])
([2.0 6.0] [2.0 8.0] [2.0 8.0] [1.0 9.0])
([2.0 12.0] [2.0 13.0])
([2.0 16.0] [2.0 18.0] [2.0 19.0])
([2.0 22.0] [1.0 23.0] [2.0 23.0] [2.0 24.0])
([2.0 27.0] [2.0 29.0])
([2.0 32.0] [2.0 33.0] [1.0 35.0])
([2.0 39.0]))
我想使用向量中的第二个值将它们分组到不同的范围
类似于((1-5)(6-10)中的分组
这里的结果也应该是重复值
([2.0 3.0] [2.0 4.0] [2.0 4.0] [2.0 12.0] [2.0 23.0] [2.0 6.0] [2.0 8.0]
[1.0 5.0]p [1.0 9.0] [2.0 8.0] [2.0 16.0] [2.0 19.0] [2.0 13.0]
[2.0 18.0] [1.0 23.0] [2.0 24.0] [2.0 22.0] [2.0 33.0] [2.0 27.0]
[1.0 29.0] [2.0 32.0] [1.0 35.0] [2.0 39.0])
(([2.0 3.0] [2.0 3.0] [2.0 4.0] [2.0 4.0] [1.0 5.0])
([2.0 6.0] [2.0 8.0] [2.0 8.0] [1.0 9.0])
([2.0 12.0] [2.0 13.0])
([2.0 16.0] [2.0 18.0] [2.0 19.0])
([2.0 22.0] [1.0 23.0] [2.0 23.0] [2.0 24.0])
([2.0 27.0] [2.0 29.0])
([2.0 32.0] [2.0 33.0] [1.0 35.0])
([2.0 39.0]))
使用map时,group by不考虑重复值,只给出不同的值。我希望所有重复的值也被分组。您可以使用
group by
和一个计算桶的函数
(defn bucket [v]
(Math/ceil (/ (second v) 5)))
(defn my-grouping [vs]
(-> (group-by bucket vs)
(map (range 1.0 8.0)))) ; quick range hack, should calculate from input
我不认为这应该只给出不同的值
(我将正确范围的计算留给读者作为练习。)
第一组由第二个数字的四舍五入除以5得出然后按键对映射进行排序(映射也是键值元组列表)
然后将
second
映射到上面,仅获取每个键的收集值问题中的两个代码块是否是您试图编写的表达式的输入和所需输出?@Arthurlfeldt Yess!我能知道你是怎么定义“v”和“v”的吗?当我定义bucket时,它说没有匹配的方法ceil。但我知道ceil的用法是(int(Math/ceil(/32)))。我是新用水桶的。@joey是的,他的Math/ceil
调用被错误地使用了。他的最后一行也只有在第二个数字不超过40的情况下才有效。v
是一个向量,vs
是输入列表。@BrandonH:除了这会漏掉空组之外。我不知道这里的期望是什么。