如何将clojure映射转换为字符串(几乎是键值对),如下所示:
Clojure数据:
(def data { :starks "Winter is coming" :Lannisters "Hear me roar" })我想把上面的内容转换成
"starks" "winter is coming" "Lannisters" "hear me roar"我不希望在"starks"之间有任何标识符/分隔符,但是很明显,"winter is coming"应该总是跟在后面
我试过这个:
(str (keys data) (vals data))它的输出如下:
"(:starks :Lannisters)(\"Winter is coming\" \"Hear me roar\")"这不是我想要的。
编辑
我真正想做的是:
我正在尝试用clojure索引几千个Neo4j节点。为了帮助我完成这个任务,我使用了新保守主义克洛尔neo4j库。
根据文档,add-to-index接受如下的属性和值:
(nn/add-to-index (:id node) (:name idx) "username" "joe")))在我上面的例子中,看起来
(nn/add-to-index (:id node) (:name idx) "starks" "winter is coming" "Lannisters" "Hear me roar")))现在,我有了我的节点,我可以使用(:data node)访问节点属性,这给了我一个clojure映射。
属性在每个节点之间都有很大的不同,所以我试图找出如何以它理解的方式将该映射传递给库。
达尼拉马吕斯的回答使我几乎如愿以偿。
正在做什么
(map name (apply concat data))仍然抱怨第三个参数,因为它有围绕结果的大括号。
所以,我怎样才能做到这一点?我是否只需要编写大量的if-not块来自己构建属性?
谢谢
发布于 2013-04-16 18:19:07
(nn/add-to-index ...)函数只接受四个参数。节点、索引和一个键/值对。所以你有太多循环你的数据,比如。
(doseq [[k v] data]
(nn/add-to-index (:id node) (:name idx) (name k) (clojure.string/lower-case v))))与Clojure中的str函数不同,add-to-index函数更加有限,而且不接受变量参数列表。
发布于 2013-04-15 15:03:15
这应该能起作用:
(map name (apply concat data))映射可以看作是键值对的序列,而键值对又表示为由2个元素组成的数组。我们将这对连接起来,然后从关键字和字符串中提取名称(对于字符串,这没有任何作用,对于关键字,它返回没有‘:’的位)。
根据您发布的代码,我猜您会这样使用:
(apply nn/add-to-index (list* (:id node) (:name idx) (map name (apply concat data))))发布于 2013-04-15 16:09:31
您可以使用向量具有类似于随机访问的数组:
=> (def v (vec (map name (apply concat data))))
=> (v 0)
;"starks"
=> (v 1)
;"Winter is coming"https://stackoverflow.com/questions/16018242
复制相似问题