按索引组合矢量

时间:2013-11-19 19:40:26

标签: clojure clojure-contrib

我正在寻找一个输入两个长度为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是步长交错。

4 个答案:

答案 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)))