2017-08-22 95 views
2

我將如何合併兩個列表說'(1 2 3 4)'(:a :b :c :d)得到 (1 :a 2 :b 3 :c 4 :d)Clojure的 - 通過指數

正如我不能只是做concat因爲這將第二列表添加到第一個列表的末尾合併兩個列表。

我想過做這樣的事情

user=> (def a '(1 2 3 4)) 

user=> (def b '(:a :b :c :d)) 

user=> (def x (apply conj (second (split-at 1 a)) (nth b 0) (reverse (first (split-at 1 a))))) 
(1 :a 2 3 4) 

user=> (def y (apply conj (second (split-at 3 x)) (nth b 1) (reverse (first (split-at 3 x))))) 
(1 :a 2 :b 3 4) 

user=> (def z (apply conj (second (split-at 5 y)) (nth b 2) (reverse (first (split-at 5 y))))) 
(1 :a 2 :b 3 :c 4) 

user=> (def q (apply conj (second (split-at 7 z)) (nth b 3) (reverse (first (split-at 7 z))))) 
(1 :a 2 :b 3 :c 4 :d) 

但我認爲這是一個更好的辦法

任何幫助,將不勝感激

回答

1

的替代interleave

(mapcat list '(1 2 3 4) '(:a :b :c :d)) 
;;=> (1 :a 2 :b 3 :c 4 :d) 

這裏mapcat有效地做cat術後雙map操作正確排序的元素,儘管在列表中的元組,所以'(1 :a)

更明確地說:

(apply concat (map list '(1 2 3 4) '(:a :b :c :d)))) 
;;=> (1 :a 2 :b 3 :c 4 :d) 

因此如果你的第一個列表真的是增加整數值,那麼你不必生成它們:

(apply concat (map-indexed list '(:a :b :c :d))) 
;;=> (0 :a 1 :b 2 :c 3 :d)