【问题标题】:Clojure - Combine two lists by indexClojure - 按索引组合两个列表
【发布时间】:2017-08-22 10:29:09
【问题描述】:

我如何结合两个列表说'(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)

但我认为有更好的方法

任何帮助将不胜感激

【问题讨论】:

    标签: clojure


    【解决方案1】:

    使用interleave:

    (interleave '(1 2 3 4) '(:a :b :c :d))
    => (1 :a 2 :b 3 :c 4 :d)
    

    【讨论】:

      【解决方案2】:

      interleave 的替代方案:

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

      这里mapcat 在双重map 操作正确排序元素之后有效地执行cat 操作,尽管在列表元组中,所以'(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)
      

      【讨论】:

        猜你喜欢
        • 2012-03-21
        • 2013-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多