或许可以使用interleave
> (interleave [1 2 3] [:a :b :c] ["X" "Y"])
(1 :a "X" 2 :b "Y")
例如,像这样
(defn people->groups
[people n-groups]
(let [group-size (quot (count people) n-groups)]
(->> (group-by :office people)
(map (comp shuffle second))
(apply interleave)
(partition group-size group-size []))))
使用方法如下
> (def ppl (for [i (range 100)] (let [office (rand-nth [:a :b :c])] {:name (str office "-" i) :office office})))
#'ppl
> (rand-nth ppl)
{:name ":a-19", :office :a}
> (people->groups ppl 4)
...
几点想法
根据您认为在人员数不能均匀分配到组数时应如何处理的边缘情况,还有一些要处理的问题。当前实现做到了什么?为什么?如何得到正确的处理方式,留作有趣的小练习 -也许可以尝试先进行测试。
从头开始使用一系列地图,就像您那样,是好的——那正是我想要做的
您的代码暗示ngroups
是一种非局部可解引用的名称,函数参数可能更有意义
我发现我几乎可以用clojure.core
中的东西重写使用loop/first/rest
的代码。尽可能多地学习clojure.core
。
希望这能有所帮助。祝您玩得开心!您正走在正确的道路上。