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é.
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é.
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 %)))
(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})
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}]
(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))
vous pouvez définir' k' comme '(touches x)' – noisesmith
@noisesmith Oui, merci. Décidé, je pourrais aussi bien présenter le code complet. –
supposons-nous que chaque vecteur dans la carte d'origine est identique? c'est-à-dire qu'ils sont tous '[1 2 3 ..]'? –
Non, dans chaque vecteur est _random_ données, mais le nombre d'objets dans chaque vecteur est le même. – Ribelo