2014-05-19 3 views
1
vecteur pour

Je voudrais remplacer cette structure,Carte des vecteurs de cartes à

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

à ce sujet.

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

Le nombre de clés n'est pas spécifié.

+0

supposons-nous que chaque vecteur dans la carte d'origine est identique? c'est-à-dire qu'ils sont tous '[1 2 3 ..]'? –

+0

Non, dans chaque vecteur est _random_ données, mais le nombre d'objets dans chaque vecteur est le même. – Ribelo

Répondre

2

J'ai trouvé la solution, solution très laide, mais elle peut expliquer ce dont j'ai besoin.

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

Si quelqu'un pouvait simplifier cela, ce serait génial.

EDIT:

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

sympa, j'ai une solution similaire – edbond

+1

Suggestion de style: il est normal d'utiliser la forme '# (...)' sur la plus petite échelle: '(fn [mm] (map # (zipmap (keys mm)%) (appliquer la carte vecteur (vals mm)))) ' – Thumbnail

0
(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}) 
0

Voici une autre solution

#(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}] 
0
(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)) 
+0

vous pouvez définir' k' comme '(touches x)' – noisesmith

+0

@noisesmith Oui, merci. Décidé, je pourrais aussi bien présenter le code complet. –

Questions connexes