Clojure 按索引组合向量

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))))) 此外,该函数还可以

我想写一个函数,输入两个长度为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)))))

此外,该函数还可以采用[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(或者其他什么-我还没有详细介绍)。然后,如果需要,可以构建另一个函数,该函数接受所有五个参数并调用四个相关函数。