我是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}])
但没有像我预期的那样有效。
答案 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})