在clojure中将序列转换为hashMap

时间:2015-09-16 10:00:27

标签: clojure sequence

我是clojure的新手,我正在阅读csv并获得如下序列 -

[[1501493_raw_html.txt 0] 
 [1501553_raw_html.txt 0]
 [1501589_raw_html.txt 0]
 [1501685_raw_html.txt 0]
 [1501727_raw_html.txt 0]]

我想将相同的值转换为键值的映射,如下所示 -

[
{:key 1501493_raw_html.txt :value 0}
{:key 1501553_raw_html.txt :value 0}
{:key 1501589_raw_html.txt :value 0}
...
]

我试过了 -

(def record (interleave [:key :value] (rest read-csv)))

(def arrange-csv-map
  ;(zipmap [:key :value] read-csv)
  (apply hash-map record)
  )

(println "Read-csv " (first arrange-csv-map ))

将输出返回为 -

Read-csv  [:key [119_raw_html.txt 0]]

我尝试了其他一些方法,比如

(into {} [:key (first value) :value {rest value}])

但没有像我预期的那样有效。

3 个答案:

答案 0 :(得分:2)

您评论的zipmap位于正确的轨道上(interleave可以正常工作,但zipmap更简单)。你的两次尝试很可能都失败了,因为你正在研究read-csv,我认为,在你的上下文中,它是一个集合或一系列行,而不是一次只能在一行上。

(zipmap [:key :value] a-line)为一行进行转换。现在,您必须使用map

为所有行执行此操作
(map (fn [line] (zipmap [:key :value] line)) read-csv)

答案 1 :(得分:1)

ABC

Clojure的reduce会帮你解决问题:

(def sample [[1501493_raw_html.txt 0] 
 [1501553_raw_html.txt 0]
 [1501589_raw_html.txt 0]
 [1501685_raw_html.txt 0]
 [1501727_raw_html.txt 0]])

(reduce #(conj %1 (assoc {} 
           :key (get %2 0)
           :value (get %2 1))) [] sample)

这基本上是说“对于每个向量,将位置元素转换为新地图中的相应键并在另一个向量中累积”

答案 2 :(得分:1)

我认为在这种情况下使用for更简单,并且使每个元素到地图的转换更加明显:

(ns ...
  (:require [clojure.pprint :refer [pprint] ] ...

(def data-list 
  [ ["1501493_raw_html.txt" 0] 
    ["1501553_raw_html.txt" 0]
    ["1501589_raw_html.txt" 0]
    ["1501685_raw_html.txt" 0]
    ["1501727_raw_html.txt" 0] ] )

(def result
  (for [entry data-list]
    { :key    (entry 0)
      :value  (entry 1) } ))
(pprint result)

结果如下:

> lein run
({:key "1501493_raw_html.txt", :value 0}
 {:key "1501553_raw_html.txt", :value 0}
 {:key "1501589_raw_html.txt", :value 0}
 {:key "1501685_raw_html.txt", :value 0}
 {:key "1501727_raw_html.txt", :value 0})