gpt4 book ai didi

Clojure:将 group-by :key 与剩余键上的 select-key 链接起来

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

我正在尝试使用 clojure 映射来理解一个简单的(与其他语言一样)工作流程。

它基本上可以归结为:如何链接这些操作?

  1. group-by: map 向量上的键

  2. 选择键在没有上一个键的剩余 map 上

  3. 再次分组(0..n次)和选择键

  4. 最后计数个唯一键实例。

另请参阅我之前的问题:Aggregate and Count in Maps

示例:

给定 map 向量

(def DATA [{:a "X", :b "M", :c "K", :d 10}
{:a "Y", :b "M", :c "K", :d 20}
{:a "Y", :b "M", :c "F", :d 30}
{:a "Y", :b "P", :c "G", :d 40}])

执行分组

(defn get-tree-level-1 [] (group-by :a DATA))

生成一个按该特定键的值分组的 map 。

{ X [{:a X, :b M, :c K, :d 10}],
Y [{:a Y, :b M, :c K, :d 20}
{:a Y, :b M, :c F, :d 30}
{:a Y, :b P, :c G, :d 40}]}

到目前为止,一切都很好。但是,如果我想从数据中构建一个树状结构,这意味着选择剩余的键并忽略一些,请选择 :b:c 并忽略 :d,这将在下一个级别产生:

(def DATA2   [{ :X [{:b "M", :c "K"}],
:Y [{:b "M", :c "K"}
{:b "M", :c "F"}
{:b "P", :c "G"}]}])

最后,计算剩余键的所有实例(例如,计算 Y-root 下 :b 键的所有唯一值):

(def DATA3   [{ :X [{:M  1}],
:Y [{:M 2}
{:P 1}])

我尝试在group-by之后执行select-keys,但第一步后结果为空:

(defn get-proc-sums []
(into {}
(map
(fn [ [k vs] ]
[k (select-keys vs [:b :c])])
(group-by :a DATA))))

最佳答案

重复应用分组依据是错误的工具:它本身不能很好地组合。相反,检查您的输入映射并将它们一次转换为对您有用的格式(使用 formap),然后对其进行缩减以构建你的树结构。这是一个简单的实现:

(defn hierarchy [keyseq xs]
(reduce (fn [m [ks x]]
(update-in m ks conj x))
{}
(for [x xs]
[(map x keyseq) (apply dissoc x keyseq)])))

user> (hierarchy [:a :b :c] '[{:a "X", :b "M", :c "K", :d 10}
{:a "Y", :b "M", :c "K", :d 20}
{:a "Y", :b "M", :c "F", :d 30}
{:a "Y", :b "P", :c "G", :d 40}])
{"Y" {"P" {"G" ({:d 40})},
"M" {"F" ({:d 30}),
"K" ({:d 20})}},
"X" {"M" {"K" ({:d 10})}}}

这将为您提供所需的分层格式,其中包含仅包含“剩余”键的所有映射的列表。由此,您可以对它们进行计数,区分它们,删除 :d 键,或者您想要的任何其他内容,通过编写另一个处理此映射的函数,或者通过调整reduce函数中发生的情况,或上面的 for 理解。

关于Clojure:将 group-by :key 与剩余键上的 select-key 链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183706/

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