【问题标题】:Map of vectors to vector of maps向量映射到地图向量
【发布时间】:2014-05-19 19:12:32
【问题描述】:

我想替换这个结构,

{:a [1 2 .. 3] :b [1 2 .. 3] :c [1 2 3 ..]} 

到这个。

[{:a 1 :b 1 c 1} {:a 2 :b 2 :c 2} {:a 3 :b 3 :c 3} ...] 

未指定键数。

【问题讨论】:

  • 我们是否假设原始地图中的每个向量都是相同的?即他们都是[1 2 3 .. ]?
  • 不,每个向量中都是随机数据,但是每个向量中的对象数量是相同的。

标签: vector map clojure


【解决方案1】:

我找到了解决方案,非常丑陋的解决方案,但它可以解释我需要什么。

#(map (fn [line] 
       (zipmap (keys %) line)) 
     (partition (count (keys %)) 
                (apply interleave (vals %))))

如果有人能简化一下,那就太好了。

编辑:

#(map (fn [vs]
     (zipmap (keys %) vs))(apply map vector (vals %)))

【讨论】:

  • 很好,我有类似的解决方案
  • 样式建议:用#( ... )最小比例表是正常的:(fn [mm] (map #(zipmap (keys mm) %) (apply map vector (vals mm))))
【解决方案2】:
(def z (sorted-map :a [1 2 3 4] :b ["a" "b" "c" "d"] :c [:i :j :k :l]))

(defn x []
  (let [k (repeat (keys z))
        v (apply map vector (vals z))]
    (map zipmap k v)))


user> (x)
({:c :i, :b "a", :a 1} {:c :j, :b "b", :a 2} {:c :k, :b "c", :a 3} {:c :l, :b "d", :a 4})

【讨论】:

    【解决方案3】:

    这是另一个解决方案

       #(mapv 
          (partial apply merge) 
          (map val 
             (group-by (comp  second first) 
             (for [[x y] % z y] (hash-map x z)))))
    
    ;=>[{:a 1, :c 1, :b 1} {:a 2, :c 2, :b 2} {:a 3, :c 3, :b 3}]
    

    【讨论】:

      【解决方案4】:
      (let [x  {1 [:a :b :c], 2 [:d :e :f], 3 [:g :h :i]}
            k (vec (keys x))
            r (map #(apply merge %)
                   (apply map (fn [ & a]
                                (merge (map-indexed
                                        (fn [idx v] {(k idx) v}) a))) (vals x)))]
            (println r))
      

      【讨论】:

      • 你可以将k定义为(keys x)
      • @noisesmith 是的,谢谢。决定我不妨展示完整的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多