Collections 使用';地图';在clojure中具有不同大小的集合

Collections 使用';地图';在clojure中具有不同大小的集合,collections,map,clojure,functional-programming,Collections,Map,Clojure,Functional Programming,我想了解在clojure中对不同大小的集合进行操作的惯用方法。有没有办法告诉函数“map”用一些默认值填充集合的其余部分 例如,假设我有3个向量: (def x [1 2 3 4]) (def y [1 2 3 4 5]) (def z [1 2 3 4 5 6 7]) (map + x y z) ; yields (3 6 9 12) 在这种情况下,我如何用零填充x和y,并获得这样的收益率: (3 6 9 12 10 6 7) map本身不起作用,但您可以使用concat和repe

我想了解在clojure中对不同大小的集合进行操作的惯用方法。有没有办法告诉函数“map”用一些默认值填充集合的其余部分

例如,假设我有3个向量:

(def x [1 2 3 4])
(def y [1 2 3 4 5])
(def z [1 2 3 4 5 6 7])

(map + x y z)    ; yields (3 6 9 12)
在这种情况下,我如何用零填充x和y,并获得这样的收益率:

(3 6 9 12 10 6 7)

map
本身不起作用,但您可以使用
concat
repeat
的组合来获得所需的结果:

(def x [1 2 3 4])
(def y [1 2 3 4 5])
(def z [1 2 3 4 5 6 7])

(map +
     (concat x (repeat 0))
     (concat y (repeat 0))
     z) ; => (3 6 9 12 10 6 7)
以下是和的API文档

这里有一个草图,你可以把它抽象出来一点,这样你就不需要知道哪个集合最长。(在上面的代码片段中,如果您将所有集合浓缩到
(重复0)
,您将拥有一个无限序列)


您可以看到一些其他方法作为答案。

您可以通过以下函数合并具有可变长度的地图向量:

(defn merge-maps
  [& args]
  (let [max-count (apply max (map #(count %1) args))
        items (map #(take max-count (concat %1 (repeat nil))) args)]
    (apply map merge items)))
该函数使解更一般化,并且可以取任意长度的映射向量

(defn merge-maps
  [& args]
  (let [max-count (apply max (map #(count %1) args))
        items (map #(take max-count (concat %1 (repeat nil))) args)]
    (apply map merge items)))