gpt4 book ai didi

recursion - Clojure 中的重组映射。将当前map中对应的值放入新map中

转载 作者:行者123 更新时间:2023-12-03 00:02:50 25 4
gpt4 key购买 nike

我想知道实现以下目标的最惯用的方法是什么。我刚刚开始使用 Clojure,正在努力寻找不依赖于传统迭代结构(for、while 等)的数据结构操作策略

如果我有如下所示的 map 结构:

(def test-map {:cat1-title "Title1", :cat1-val "Value1", :cat2-title "Title2", :cat2-val "Value2"})

我想将其转换为以下结构:

{"Title1" "Value1", "Title2" "Value2"}

本质上,我想制作一个新 map ,其键是 *title 键的值,值是相应 *value 键的值。

执行此操作的最佳 clojure 方法是什么?

我尝试过以下内容(我不知道它是否总是有效)。它本质上是提取 *title 值,然后用提取的 *val 值将它们压缩

(let [titles
(vals (filter #(re-matches #".*-title"
(str (key %)))
test-map))
values
(vals (filter #(re-matches #".*-val"
(str (key %)))
test-map))]
(zipmap titles values))

这成功地提取了键和值,但我不确定将它们与 zipmap 一起压缩是否是最好的方法,或者是组合它们的最惯用的方法。

最佳答案

对于较大的 map ,Zipmap 将失败,因为键/值对在 map 内没有严格的排序。对于小 map ,它们通常遵循您创建它们的顺序,因为小 map 被创建为 PersistentArrayMap。大型映射是PersistentHashMap。观察 (apply hash-map (range 100))(apply hash-map (range 10)) 的结果 因此,如果您有更大的 map ,您的 -titles不会与您的 -vals 对齐

不幸的是,这意味着您确实需要查找与您的标题明确匹配的值。这是一种方法:

(defn transform [m]
(into {} (for [[k v] m
:let [title (name k)]
:when (.endsWith title "-title")
:let [val-name (clojure.string/replace title #"-title$" "-val")]]
[v (m (keyword val-name))])))

对于每个以 title 结尾的键,查找具有相同前缀的 val,并将其全部放入映射中。

关于recursion - Clojure 中的重组映射。将当前map中对应的值放入新map中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35856408/

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