我如何合并两个列表'(1 2 3 4)
和'(:a :b :c :d)
来获取
(1 :a 2 :b 3 :c 4 :d)
因为我不能只做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)
但我认为还有更好的方法
非常感谢任何帮助
答案 0 :(得分:6)
使用interleave
:
(interleave '(1 2 3 4) '(:a :b :c :d))
=> (1 :a 2 :b 3 :c 4 :d)
答案 1 :(得分: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)
因此,如果您的第一个列表确实是增加整数值,那么您不必生成它们:
layouts