在clojure中将序列转换为hashMap

在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

我对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}
...
]
我想将其转换为键值映射,如下所示-

[[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})