2013-12-17 31 views
1

所以我有一個載體,它看起來有點像這樣從矢量

["John" 23 "5551234" "Sally" 34 "5556667"] 

載體含有很多像這樣的項目,我試圖做的就是像圖的矢量建立一個地圖這個:

[{:name "John" :age 23 :ph "5551234"} {:name "Sally" :age 34 :ph "5556667"}] 

有沒有辦法做到這一點?

+0

你如何讓你的記錄?那是你將它們作爲分隔數據閱讀,還是按照所示構建它們? – octopusgrabbus

+0

我把它們從網站上刮下來 – Jeroko

+0

謝謝。我想你沒有以分隔的形式獲得記錄。 – octopusgrabbus

回答

10
(def sample ["John" 23 "5551234" "Sally" 34 "5556667" "Harry" 42 "5554242"]) 

將輸入向量劃分爲使用例如記錄的記錄。 (partition 3 sample)(每條記錄有3種元素),然後

映射一個zipmap:

(mapv #(zipmap [:name :age :ph] %) (partition 3 sample)) 
; => [{:ph "5551234", :age 23, :name "John"} 
;  {:ph "5556667", :age 34, :name "Sally"} 
;  {:ph "5554242", :age 42, :name "Harry"}] 

或者使用for理解(返回一個懶惰的序列,而不是一個向量):

(for [[name age ph] (partition 3 sample)] {:name name :age age :ph ph}) 
; => ({:name "John", :age 23, :ph "5551234"} 
     {:name "Sally", :age 34, :ph "5556667"} 
     {:name "Harry", :age 42, :ph "5554242"}) 

注意鍵順序沒有爲地圖定義。 for comphrehension使用數組映射,因爲鍵值對的數量很小,因此鍵的順序依次出現,但這是一個實現細節。如果順序很重要,可以顯式使用數組映射,但在較大的映射上查找性能會受到影響。

+0

這是關鍵訂單的混合,但我認爲問題在於我的數據源 – Jeroko

+0

@Jeroko Key沒有爲散列圖定義。 –

+0

沒關係修復它。謝謝! – Jeroko

0

另外一對夫婦選擇:

(->> ["John" 23 "5551234" "Sally" 34 "5556667"] 
    (partition 3) 
    (map (fn [[name age ph]] 
      {:name name :age age :ph ph}))) 

(->> ["John" 23 "5551234" "Sally" 34 "5556667"] 
    (partition 3) 
    (map (partial interleave [:name :age :ph])) 
    (map (partial apply hash-map)))