Clojure 按索引组合向量
我想写一个函数,输入两个长度为n的向量 i、 e.[:a:b:c:d:e:f][1 2 3 4 5 6]。 输出一个长度为2n的向量 [:a1:b2:c3:d4:e5:f6] 但是,如果输入的第二个向量与n的长度不匹配,它将循环 i、 e.[:a:b:c:d:e:f][1 2 3] 输出:[:A1:B2:C3:D1:E2:F3]Clojure 按索引组合向量,clojure,clojure-contrib,Clojure,Clojure Contrib,我想写一个函数,输入两个长度为n的向量 i、 e.[:a:b:c:d:e:f][1 2 3 4 5 6]。 输出一个长度为2n的向量 [:a1:b2:c3:d4:e5:f6] 但是,如果输入的第二个向量与n的长度不匹配,它将循环 i、 e.[:a:b:c:d:e:f][1 2 3] 输出:[:A1:B2:C3:D1:E2:F3] (defn Swanson [x y] (vec (flatten (interleave x (repeat (count x) y))))) 此外,该函数还可以
(defn Swanson [x y] (vec (flatten (interleave x (repeat (count x) y)))))
此外,该函数还可以采用[x y min max n],其中x和y是向量,min是开始交织的索引,max是结束交织的索引,n是交织的步长 您可以使用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)
希望这有帮助 您想要
循环:
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)
对于两个任意大小的向量:
(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)
对于x和y向量,最小(包括)起始索引,最大(排除)结束索引,n步长:
(defn swanson [x y min max n]
(->> (interleave x (cycle y))
(take max)
(drop min)
(take-nth n)))
或者,如果您只关心第一个序列的长度,您可以简单地执行(defn cycleave[ab](interleave a(cycle b)))
,这将在(*2(count a))
元素处停止,如果您只想返回n
元素:(defn cycleave[ab n](取n(interleave(cycle a)(cycle b)))
我认为min/max/n参数不属于此函数,它们添加了太多不相关的职责。相反,使用这个函数的一个简单版本,只使用x/y,并结合take、drop和take-nth(或者其他什么-我还没有详细介绍)。然后,如果需要,可以构建另一个函数,该函数接受所有五个参数并调用四个相关函数。