You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含向量的映射集合转换为映射向量?(Clojure,限core库)

解决思路与代码实现

要完成从「映射的向量」到「向量的映射」的转换,我们可以借助Clojure核心库的函数分步骤实现:

步骤拆解

  1. 合并映射:先将原始的多个独立小映射合并为一个包含所有键值对的大映射,方便统一处理所有键和对应的元素序列。
  2. 提取键与序列:从合并后的映射中分离出目标键(:a、:b、:c)和每个键对应的元素序列。
  3. 按位置分组元素:将所有元素序列按索引位置对齐,把每个序列的第n个元素归为一组。
  4. 重组为新映射:将每个位置分组的元素与对应的键配对,生成最终的映射向量。

完整代码

(def data
  [{:a [{0 0} {2 2} {9 9}]}
   {:b [{2 2} {5 6} {7 7}]}
   {:c [{0 1} {5 5} {5 3}]}])

(defn restructure [input]
  (let [merged-map (apply merge input)
        target-keys (keys merged-map)
        value-seqs (vals merged-map)]
    (map #(zipmap target-keys %) (apply map list value-seqs))))

;; 调用测试
(restructure data)
;; 输出结果:
;; ({:a {0 0}, :b {2 2}, :c {0 1}} 
;;  {:a {2 2}, :b {5 6}, :c {5 5}} 
;;  {:a {9 9}, :b {7 7}, :c {5 3}})

代码细节说明

  • apply merge input:把原始的三个小映射合并成一个大映射{:a [...], :b [...], :c [...]}。
  • keys merged-map:提取所有需要保留的键,后续用于生成新映射。
  • vals merged-map:获取每个键对应的元素序列,即三个长度为3的向量。
  • apply map list value-seqs:利用map多序列处理的特性,将三个向量按位置分组,得到(({0 0} {2 2} {0 1}) ({2 2} {5 6} {5 5}) ({9 9} {7 7} {5 3}))。
  • zipmap target-keys %:将每个位置分组的元素与键一一配对,生成单个映射,最终通过map处理所有分组,得到目标向量。

内容的提问来源于stack exchange,提问作者triplej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:22:42