如何将含向量的映射集合转换为映射向量?(Clojure,限core库)
解决思路与代码实现
要完成从「映射的向量」到「向量的映射」的转换,我们可以借助Clojure核心库的函数分步骤实现:
步骤拆解
- 合并映射:先将原始的多个独立小映射合并为一个包含所有键值对的大映射,方便统一处理所有键和对应的元素序列。
- 提取键与序列:从合并后的映射中分离出目标键(
:a、:b、:c)和每个键对应的元素序列。 - 按位置分组元素:将所有元素序列按索引位置对齐,把每个序列的第n个元素归为一组。
- 重组为新映射:将每个位置分组的元素与对应的键配对,生成最终的映射向量。
完整代码
(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
相关产品推荐
相关产品推荐

