如何在没有键的情况下将地图转换为集合

时间:2015-03-19 20:26:08

标签: clojure

我有这样的地图:

{1 [1 4 7], 2 [2 5 8], 0 [3 6 9]}

我想编写一个返回此函数的函数:

[[1 4 7] [2 5 8] [3 6 9]]

作为旁注,我通过这样做得到了地图:

(group-by #(mod % 3) [1 2 3 4 5 6 7 8 9])

如果有人有这样的矢量快捷方式:[1 2 3 4 5 6 7 8 9]到上面显示的第二个,请告诉我!

2 个答案:

答案 0 :(得分:3)

至于你的另一个问题:(partition 3 v)创建一个矩阵,而(apply map vector m)是一个用于转置矩阵m的习惯用法(它是如何工作的?为读者练习或google它)。所以:

> (apply map vector (partition 3 [1 2 3 4 5 6 7 8 9]))
([1 4 7] [2 5 8] [3 6 9])

当然还有其他方法。例如,通过解构:

> (let [{ a 0 b 1 c 2 } (group-by #(mod % 3) [1 2 3 4 5 6 7 8 9])] [b c a])
[[1 4 7] [2 5 8] [3 6 9]]

答案 1 :(得分:2)

订单有关系吗? vals采用地图,并返回一系列值。但是没有为地图定义顺序,因此返回的值序列的顺序是任意的。

> (vals {1 [1 4 7], 2 [2 5 8], 0 [3 6 9]})
([3 6 9] [1 4 7] [2 5 8])

排序:

> (sort (vals {1 [1 4 7], 2 [2 5 8], 0 [3 6 9]}))
([1 4 7] [2 5 8] [3 6 9])