Clojure 中的循环分配
Round robin distribution in Clojure
我想知道是否有人有任何关于 Clojure 中的循环分配的资源?
我有一个函数可以将传递的数据拆分成单独的映射,如下所示:
(defn round-robin
"Divides the dataset into distinct maps using
round robin distribution"
[data sets split]
(partition split data)
)
我的问题是我不确定如何将这些地图分配到定义的 "sets" 数量中。我想我可以用这样的东西事先创建地图:
(defn create-map-set
"Creates a set of (count) maps"
[count set]
(if(= count 0) set (recur (- count 1) (conj set
'())))
)
但由于我无法引用索引,因此很难将数据与特定地图合并。
这是我的预期:
Input: ((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
Output: ((2 5 1 4) (3 2 3 7) (7 3 4 2))
我在向地图添加数据时基本上是 1 2 3、1 2 3。
我会说明我是如何解决这个问题的。 Clojure 非常有利于这种实验。 (leetwinski 在他的评论中有效地给出了这个答案。)
从数据开始。
'((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
将其放入线程宏
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))) ===> ((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
中途分区
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)) ===> (((2 5) (3 2) (7 3)) ((1 4) (3 7) (4 2)))
此时,我们(总是)得到两个元素。如果我们可以将它们传递给 map
,然后连接每两个元素,我们就完成了。所以,
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)
(apply map concat)) ===> ((2 5 1 4) (3 2 3 7) (7 3 4 2))
现在,删除硬编码的东西:
(defn round-robin [s]
(let [half-len (quot (count s) 2)]
(->> s
(partition half-len)
(apply map concat))))
请注意,如果输入为奇数长度,函数将忽略最后一个元素。
我的经验是,每当您想对某些数据进行一些转换时,只需将数据推送到线程最后一个宏 (->>
) 并继续对其进行处理是值得的。这个问题很简单,但是这个方法也适用于复杂的转换。
我想知道是否有人有任何关于 Clojure 中的循环分配的资源?
我有一个函数可以将传递的数据拆分成单独的映射,如下所示:
(defn round-robin
"Divides the dataset into distinct maps using
round robin distribution"
[data sets split]
(partition split data)
)
我的问题是我不确定如何将这些地图分配到定义的 "sets" 数量中。我想我可以用这样的东西事先创建地图:
(defn create-map-set
"Creates a set of (count) maps"
[count set]
(if(= count 0) set (recur (- count 1) (conj set
'())))
)
但由于我无法引用索引,因此很难将数据与特定地图合并。
这是我的预期:
Input: ((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
Output: ((2 5 1 4) (3 2 3 7) (7 3 4 2))
我在向地图添加数据时基本上是 1 2 3、1 2 3。
我会说明我是如何解决这个问题的。 Clojure 非常有利于这种实验。 (leetwinski 在他的评论中有效地给出了这个答案。)
从数据开始。
'((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
将其放入线程宏
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))) ===> ((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
中途分区
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)) ===> (((2 5) (3 2) (7 3)) ((1 4) (3 7) (4 2)))
此时,我们(总是)得到两个元素。如果我们可以将它们传递给 map
,然后连接每两个元素,我们就完成了。所以,
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)
(apply map concat)) ===> ((2 5 1 4) (3 2 3 7) (7 3 4 2))
现在,删除硬编码的东西:
(defn round-robin [s]
(let [half-len (quot (count s) 2)]
(->> s
(partition half-len)
(apply map concat))))
请注意,如果输入为奇数长度,函数将忽略最后一个元素。
我的经验是,每当您想对某些数据进行一些转换时,只需将数据推送到线程最后一个宏 (->>
) 并继续对其进行处理是值得的。这个问题很简单,但是这个方法也适用于复杂的转换。