- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 clojure 映射来理解一个简单的(与其他语言一样)工作流程。
它基本上可以归结为:如何链接这些操作?
group-by
: map 向量上的键
选择键
在没有上一个键的剩余 map 上
再次分组
(0..n次)和选择键
最后计数
个唯一键实例。
另请参阅我之前的问题: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))))
最佳答案
重复应用分组依据是错误的工具:它本身不能很好地组合。相反,检查您的输入映射并将它们一次转换为对您有用的格式(使用 for
或 map
),然后对其进行缩减以构建你的树结构。这是一个简单的实现:
(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/
我正在尝试执行 vagrant up 但一直遇到此错误: ==> default: IOError: [Errno 13] Permission denied: '/usr/local/lib/pyt
我在容器 div 中有一系列动态创建的不同高度的 div。 Varying text... Varying text... Varying text... Varying text.
通过 cygwin 运行 vagrant up 时遇到以下错误。 stderr: /bin/bash: /home/vagrant/.ansible/tmp/ansible-tmp-14872260
今天要向小伙伴们介绍的是一个能够快速地把数据制作成可视化、交互页面的 Python 框架:Streamlit,分分钟让你的数据动起来! 犹记得我在做机器学习和数据分析方面的毕设时,
我是 vagrant 的新手,正在尝试将第二个磁盘添加到我正在用 vagrant 制作的虚拟机中。 我想出了如何在第一次启动虚拟机时连接磁盘,但是当我关闭机器时 然后再次备份(使用 'vagrant
我是一名优秀的程序员,十分优秀!