gpt4 book ai didi

clojure - 如何在 Clojure 中迭代映射键和值?

转载 作者:行者123 更新时间:2023-12-03 05:40:39 25 4
gpt4 key购买 nike

我有以下我想要迭代的 map :

(def db {:classname "com.mysql.jdbc.Driver" 
:subprotocol "mysql"
:subname "//100.100.100.100:3306/clo"
:username "usr" :password "pwd"})

我尝试了以下方法,但它不是一次打印键和值,而是以各种组合重复打印键和值:

(doseq [k (keys db) 
v (vals db)]
(println (str k " " v)))

我想出了一个解决方案,但布莱恩的(见下文)更符合逻辑。

(let [k (keys db) v (vals db)] 
(do (println (apply str (interpose " " (interleave k v))))))

最佳答案

这是预期的行为。 (doseq [x ... y ...]) 将为 x 中的每个项目迭代 y 中的每个项目。

相反,您应该迭代 map 本身一次。 (seq some-map) 将返回一个包含两项向量的列表,每个向量对应映射中的每个键/值对。 (实际上它们是 clojure.lang.MapEntry,但行为类似于 2 项向量。)

user> (seq {:foo 1 :bar 2})
([:foo 1] [:bar 2])

doseq 可以像其他任何序列一样迭代该 seq。与 Clojure 中处理集合的大多数函数一样,doseq 在迭代集合之前会在内部调用 seq。所以你可以简单地这样做:

user> (doseq [keyval db] (prn keyval))
[:subprotocol "mysql"]
[:username "usr"]
[:classname "com.mysql.jdbc.Driver"]
[:subname "//100.100.100.100:3306/clo"]
[:password "pwd"]

您可以使用keyval,或者firstsecond,或者nthget 从这些向量中获取键和值。

user> (doseq [keyval db] (prn (key keyval) (val keyval)))
:subprotocol "mysql"
:username "usr"
:classname "com.mysql.jdbc.Driver"
:subname "//100.100.100.100:3306/clo"
:password "pwd"

更简洁地说,您可以使用解构将映射条目的每一半绑定(bind)到可以在 doseq 表单中使用的一些名称。这是惯用的:

user> (doseq [[k v] db] (prn k v))
:subprotocol "mysql"
:username "usr"
:classname "com.mysql.jdbc.Driver"
:subname "//100.100.100.100:3306/clo"
:password "pwd"

关于clojure - 如何在 Clojure 中迭代映射键和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6685916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com