2017-11-28 4 views
0

ベクトルにおけるベクトルのシーケンスにキーを追加し、ハッシュマップに変換考える

[["foo" "bar" 2] ["biz" "baf" 3]] 

を私は

[{:a "foo" :b "bar" :num 2} {:a "biz" :b "baf" :num 3}]? 

が現実に私のベクトルが必要とするベクトルの数百を持っているのですかどのようにキーが追加され、ハッシュマップに変換されます。何leetwinski

+3

を探し出すためにのためにテストを生成する。このような何か: '(mapv(部分zipmap [:a:b:num])["" foo "" bar "2" ["biz" "baf" 3]]) – leetwinski

+0

このおかげで...トリックをやった! 私はこれを答えとして受け入れましたが、私はできるとは思わないとコメントしています。 – THX1137

答えて

1

は言った、または:

(def input [["foo" "bar" 2]["biz" "baf" 3]]) 

(mapv (fn [[a b num]] 
     {:a a 
     :b b 
     :num num}) input) 

あなたが大量のデータを変換する必要がある場合、それは一度にメモリ内の全ベクトルを維持しますので、多分mapvが最良の選択肢ではありません。普通のmapは遅延セクションを作成します。そうしないとトランスデューサが良いかもしれません。

+0

すごく、ありがと...メモリの側面は、心に留めておくのは間違いありません! – THX1137

+0

私の場合は、リファクタリングが容易で読みやすいので、この変種はzipmapよりも優れていることがわかります – leetwinski

+0

この方法はzipmapよりも優れていますが、22対220気づく。 –

0

一般解:読者のため

(defn vectors->maps 
"takes a vector of vectors containing values and a vector of keys 
    and returns a vector of maps such that each value at index n in the value 
    vector is paired with each key at index n in the keys vector 
    ex: (vectors->maps [["foo" "bar" 2] ["biz" "baf" 3]], [:a :b :num]) 
     => [{:a "foo", :b "bar", :num 2} {:a "biz", :b "baf", :num 3}]" 
    [vectors keys] 
(mapv (partial zipmap keys) vectors)) 

演習:この機能のためのスペックを書いて、それは任意のエッジケース

関連する問題