Clojure - 分裂矢量

时间:2017-05-24 10:43:43

标签: clojure

如果我有两个论点[[1 2] [3 4]]和[5 6],我怎样才能达到[[1 5] [2 6] [3 5] [4 6]]。

我想我可能不得不使用for所以我试过了,

(for [x [[1 2] [3 4]]] 
  (for [xx x] 
    (for [y [5 6]] [xx y])))

但它返回了((([1 5] [1 6]) ([2 5] [2 6])) (([3 5] [3 6]) ([4 5] [4 6])))

非常感谢任何帮助。感谢

3 个答案:

答案 0 :(得分:4)

(mapcat #(map vector % [5 6]) [[1 2] [3 4]])

或使用for

(for [c [[1 2] [3 4]]
      p (map vector c [5 6])]
  p)

答案 1 :(得分:2)

如果我理解你的问题,你的解决方案实际上非常接近。您不需要显式嵌套for表达式,因为这样做会在每个级别创建一个新列表,而只需使用多个绑定:

(for [x [[1 2][3 4]]
      xx x
      y [5 6]]
  [xx y])

这将导致

([1 5] [1 6] [2 5] [2 6] [3 5] [3 6] [4 5] [4 6])

修改

现在我终于仔细阅读了你的问题,我想出了与@Lee (mapcat (fn[x] (map vector x [5 6])) [[1 2] [3 4]])相同的答案,这是正确的答案,应该被接受。

答案 2 :(得分:0)

这是一种(嗯 - 不是特别优雅)获得答案的方式,而不使用for

(defn f [x y]
  (let [x' (apply concat x)
        multiples (/ (count x') (count y))
        y' (apply concat (repeat multiples y))]
    (mapv vector x' y')))

(f [[1 2] [3 4]] [5 6])
;;=> [[1 5] [2 6] [3 5] [4 6]]