Clojure csv映射为{:key1{a,b,c},:key2{n,m,k}
装载后:Clojure csv映射为{:key1{a,b,c},:key2{n,m,k},clojure,Clojure,装载后: (csv/read-csv "Fetch, get, bring \n Take, receive, accept") 我得到: (["Fetch" " get" " bring "] [" Take" " receive" " accept"]) 现在,我想将其转换为具有唯一键和设置为值的地图,如: [:key1 #{Fetch, get, bring}, :key2 #{Take, receive, accept}] 我的目标是能够查找一个单词,说get,然后返回“Fet
(csv/read-csv "Fetch, get, bring \n Take, receive, accept")
我得到:
(["Fetch" " get" " bring "] [" Take" " receive" " accept"])
现在,我想将其转换为具有唯一键和设置为值的地图,如:
[:key1 #{Fetch, get, bring}, :key2 #{Take, receive, accept}]
我的目标是能够查找一个单词,说get,然后返回“Fetch,bring”我能够得到类似的东西,这对我来说很有用 inp正在([“获取”“获取”“带来”][“获取”“接收”“接受”]) 我的目标是能够查找单词,说get,然后返回“Fetch,bring” 不完全确定您的目标,但这并没有阻止我实现一个函数,该函数可以获取一个单词的所有同级。我认为你不需要一张带有随机键的地图,是吗?请注意,集合实现为哈希映射,其中值与键相同(例如,
{:a:b}
是一个环绕{:a:a,:b:b}
)
现在,首先将数据解析为单词集列表:
(def word-sets
(map (comp set #(map string/trim %))
(csv/read-csv "Fetch, get, bring \n Take, receive, accept")))
;; => (#{"bring" "Fetch" "get"} #{"accept" "Take" "receive"})
然后使用函数获取单词的同级:
(defn siblings [word]
(mapcat #(when (contains? % word) (disj % word))
word-sets))
使用set操作符contains?
检查每个单词集是否包含单词,如果是,则返回该单词集,并将该单词disj
oined。由于when
,不包含该单词的单词集将变为nil
,而mapcat
将删除nil
项,并将其余项合并到一个平面列表中
例如:
到目前为止,你做了什么尝试?我的思路是:user=>(doseq[i inm].\u=>(let[x(gensym:key”)].\u=>(assoc hm x i))。\u=>(prn hm))为什么要将要在地图值中查找的内容打包?@cfrick我最终使用了集合。感谢您的回复,我非常感谢。!我最终使用了一个集合,但为了完成,我只是添加了一个答案,让我们接近我开始使用的东西。
(defn siblings [word]
(mapcat #(when (contains? % word) (disj % word))
word-sets))
(siblings "get")
;; => ("bring" "fetch")
(siblings "Take")
;; => ("accept" "receive")
(siblings "non existing")
;; => '()