我正在寻找一个输入两个长度为n的向量的函数,
即。 [:a:b:c:d:e:f] [1 2 3 4 5 6]。 输出一个长度为2n的向量
[:a 1:b 2:c 3:d 4:e 5:f 6]。
但是,如果输入的第二个向量与n的长度不匹配,它将循环,
即。 [:a:b:c:d:e:f] [1 2 3]
输出:[:a 1:b 2:c 3:d 1:e 2:f 3]。
(defn Swanson [x y] (vec (flatten (interleave x (repeat (count x) y)))))
此外,函数也可以取[xy min max n],其中x和y是向量,min是开始交织的索引,max是结束交织的索引,n是步长交错。
答案 0 :(得分:6)
您想要cycle
:
user> (take 6 (cycle [1 2 3]))
(1 2 3 1 2 3)
user> (interleave [:a :b :c :d :e :f] (cycle [1 2 3]))
(:a 1 :b 2 :c 3 :d 1 :e 2 :f 3)
答案 1 :(得分:1)
您可以使用seq库中的interleave函数:
=> (interleave [:a :b :c :d :e :f] [1 2 3 4 5 6])
(:a 1 :b 2 :c 3 :d 4 :e 5 :f 6)
希望这有帮助!
答案 2 :(得分:1)
两个任意大小的向量:
(defn cycleave [a b]
(let [c (max (count a) (count b))]
(take (* 2 c) (interleave (cycle a)
(cycle b)))))
会给:
user => (cycleave [:a :b :c :d :e :f] [1 2 3])
(:a 1 :b 2 :c 3 :d 1 :e 2 :f 3)
答案 3 :(得分:1)
使用x和y向量,min(包括)起始索引,max(不包括)结束索引,n步长:
(defn swanson [x y min max n]
(->> (interleave x (cycle y))
(take max)
(drop min)
(take-nth n)))