在clojure中将序列转换为hashMap
我对clojure非常陌生,我正在阅读csv,并获得如下序列-在clojure中将序列转换为hashMap,clojure,sequence,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 150
[[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}
...
]
我想将其转换为键值映射,如下所示-
[[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}])
但一切都没有我想象的那么好。ABC
Clojure's将为您带来好处:
(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)
这基本上是说“对于每个向量,将位置元素转换为新地图中的各个关键点,并累积到另一个向量中”ABC
Clojure's将为您带来好处:
(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)
这基本上是说“对于每个向量,将位置元素转换为新地图中的各个关键点,并累积到另一个向量中”您的注释出来的
zipmap
是正确的(interleave
可以工作,但zipmap
更简单)。您的两次尝试都很可能失败,因为您正在处理read csv
,我假定,在您的上下文中,这是一个行的集合或序列,而不是一次在一行上
(zipmap[:key:value]a-line)
对一行执行所需的转换。现在,您必须使用map
对所有行执行此操作:
(map (fn [line] (zipmap [:key :value] line)) read-csv)
您的注释掉的
zipmap
在正确的轨道上(interleave
可以工作,但是zipmap
更简单)。您的两次尝试都很可能失败,因为您正在处理read csv
,我假定,在您的上下文中,这是一个行的集合或序列,而不是一次在一行上
(zipmap[:key:value]a-line)
对一行执行所需的转换。现在,您必须使用map
对所有行执行此操作:
(map (fn [line] (zipmap [:key :value] line)) read-csv)
我认为在这种情况下,使用
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})
我认为在这种情况下,使用
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})
您没有将序列转换为映射。你正在将向量向量转换为映射向量,其中向量是一种序列,而不是将序列转换为映射。您正在将向量向量转换为映射向量,其中向量是一种序列output@FrankC. 这些天(Clojure 1.7+)我更喜欢
(into[](map f)coll)
而不是(mapv f coll)
@cgrand我为什么要使用into,有什么性能影响吗?@FrankC。对我来说,mapv
(和filterv
)是传统的:它们的用例可以通过更通用的(进入[]xform coll)
来更好地服务(适用于任何传感器,而不仅仅是map
和filter
)。@cgrand-Cool,我想知道是什么促使你发表评论。也许是mapv
,因为他想要一个向量集合作为output@FrankC. 这些天(Clojure 1.7+)我更喜欢(into[](map f)coll)
而不是(mapv f coll)
@cgrand我为什么要使用into,有什么性能影响吗?@FrankC。对我来说,mapv
(和filterv
)是传统的:它们的用例可以通过更通用的(进入[]xform coll)
来更好地服务(适用于任何传感器,而不仅仅是map
和filter
)。@cgrand-Cool,我想知道是什么驱动了你的评论。如果你解构条目而不是用1和0调用它更好,这对我来说似乎很尴尬:(对于[[kv]数据列表]{:key k:value v})
如果你解构条目而不是用1和0调用它更好,这对我来说似乎很尴尬:(对于[[kv]数据列表]{:k键:值v})