首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用specter从深度嵌套的数据结构中修剪不必要的条目

使用specter从深度嵌套的数据结构中修剪不必要的条目
EN

Stack Overflow用户
提问于 2019-07-11 14:08:07
回答 2查看 186关注 0票数 2

我希望使用Clojure来简化深度嵌套的数据结构。我想删除:

  • 任何具有零值的条目
  • 任何带有空字符串值的条目
  • 任何带有空映射值的条目
  • 具有空顺序值的任何条目
  • 删除上述情况后具有映射/顺序值的任何条目都为空。

就像这样:

代码语言:javascript
复制
(do-something
    {:a {:aa 1}                                               
       :b {:ba -1                                               
           :bb 2                                                
           :bc nil
           :bd ""
           :be []
           :bf {}
           :bg {:ga nil}
           :bh [nil]
           :bi [{}]
           :bj [{:ja nil}]}
       :c nil
       :d ""
       :e []
       :f {}
       :g {:ga nil}
       :h [nil]
       :i [{}]
       :j [{:ja nil}]})
    =>
    {:a {:aa 1} 
         :b {:ba -1 
             :bb 2}}

我有香草克洛尔的东西:

代码语言:javascript
复制
(defn prunable?
  [v]
  (if (sequential? v)
    (keep identity v)
    (or (nil? v) (#{"" [] {}} v))))

(defn- remove-nil-values
  [ticket]
  (clojure.walk/postwalk
    (fn [el]
      (if (map? el)
        (let [m (into {} (remove (comp prunable? second) el))]
          (when (seq m)
            m))
        el))
    ticket))

我想我需要一些recursive-path,但我不会走得太快。非常感激的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-12 08:08:41

多亏了克鲁朱利安河床上的nathanmarz

代码语言:javascript
复制
(def COMPACTED-VALS-PATH
  (recursive-path [] p
                  (continue-then-stay
                    (cond-path
                      map? [(compact MAP-VALS) p]
                      vector? [(compact ALL) p]))))

(defn- compact-data
  [m]
  (setval [MAP-VALS COMPACTED-VALS-PATH #(or (nil? %) (= "" %))] NONE m))
票数 1
EN

Stack Overflow用户

发布于 2019-07-11 14:54:54

比较不同版本与specter实现的性能:

@bm1729 1729纯香草版:

代码语言:javascript
复制
Evaluation count : 1060560 in 60 samples of 17676 calls.
             Execution time mean : 57.083226 µs
    Execution time std-deviation : 543.184398 ns
   Execution time lower quantile : 56.559237 µs ( 2.5%)
   Execution time upper quantile : 58.519433 µs (97.5%)
                   Overhead used : 7.023993 ns

Found 5 outliers in 60 samples (8.3333 %)
    low-severe   3 (5.0000 %)
    low-mild     2 (3.3333 %)
 Variance from outliers : 1.6389 % Variance is slightly inflated by outliers

以下版本:

代码语言:javascript
复制
Evaluation count : 3621960 in 60 samples of 60366 calls.
             Execution time mean : 16.606135 µs
    Execution time std-deviation : 141.114975 ns
   Execution time lower quantile : 16.481250 µs ( 2.5%)
   Execution time upper quantile : 16.922734 µs (97.5%)
                   Overhead used : 7.023993 ns

Found 9 outliers in 60 samples (15.0000 %)
    low-severe   6 (10.0000 %)
    low-mild     3 (5.0000 %)
 Variance from outliers : 1.6389 % Variance is slightly inflated by outliers
代码语言:javascript
复制
(defn prune [x]
  (cond
    (map? x) (not-empty
              (reduce-kv
               (fn [s k v]
                 (let [v' (prune v)]
                   (cond-> s
                     v' (assoc k v'))))
               (empty x)
               x))

    (seqable? x) (not-empty
                  (into
                   (empty x)
                   (->> x (map prune) (filter identity))))

    :else x))

测试用例:

代码语言:javascript
复制
(prune {:a {:aa 1}
        :b  {:ba -1
             :bb 2
             :bc nil
             :bd ""
             :be []
             :bf {}
             :bg {:ga nil}
             :bh [nil]
             :bi [{}]
             :bj [{:ja nil}]}
        :c  nil
        :d  ""
        :e  []
        :f  {}
        :g  {:ga nil}
        :h  [nil]
        :i  [{}]
        :j  [{:ja nil}]})
;; => {:b {:bb 2, :ba -1}, :a {:aa 1}}

更新- @bm1729 1729规范版

代码语言:javascript
复制
Evaluation count : 3314820 in 60 samples of 55247 calls.
             Execution time mean : 18.421613 µs
    Execution time std-deviation : 591.106243 ns
   Execution time lower quantile : 18.148204 µs ( 2.5%)
   Execution time upper quantile : 20.674292 µs (97.5%)
                   Overhead used : 7.065044 ns

Found 8 outliers in 60 samples (13.3333 %)
    low-severe   2 (3.3333 %)
    low-mild     6 (10.0000 %)
 Variance from outliers : 18.9883 % Variance is moderately inflated by outliers
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56991156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档