gpt4 book ai didi

Clojure:删除树的所有叶子中的值

转载 作者:行者123 更新时间:2023-12-05 08:37:33 26 4
gpt4 key购买 nike

我在 clojure 中实现了一个 trie,但我在使用 remove-values 函数时遇到困难。我使用的结构如下所示:

(def trie {\a {:value #{"val1" "val2"}}
\b {\c {:value #{"val1"}}
:value #{"val2"}}})

我想调用这样的函数 (remove-value trie "val1") 并获得一个结构,在该结构中,“val1”的所有实例都从叶节点的集合中移除。生成的 trie 将如下所示:

{\a {:value #{"val2"}}
\b {\c {:value #{}}
:value #{"val2"}}}

或者更好的是:

{\a {:value #{"val2"}}
\b {:value #{"val2"}}}

从我在 SO 上看到的情况来看,这可能可以用五行 clojure 来完成,但我不知道如何做。此外,我与数据结构无关,如果您需要更改它以使惯用版本正常工作,请随意,只要它仍然是一个 trie。

最佳答案

一种方法是使用postwalk。例如

(def trie {\a {:value #{"val1" "val2"}}
\b {\c {:value #{"val1"}}
:value #{"val2"}}})
; #'user/trie
(require '[clojure.walk :refer [postwalk]])
; nil
(doc postwalk)
; -------------------------
; clojure.walk/postwalk
; ([f form])
; Performs a depth-first, post-order traversal of form. Calls f on
; each sub-form, uses f's return value in place of the original.
; Recognizes all Clojure data structures. Consumes seqs as with doall.
; nil
(postwalk #(if (set? %) (disj % "val1") %) trie)
; {\a {:value #{"val2"}}, \b {\c {:value #{}}, :value #{"val2"}}}

从那里您还可以对 map 进行过滤(dissoc 字符键,如果它们不再具有任何值)

关于Clojure:删除树的所有叶子中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65394411/

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