如何根据动态给出的列值对嵌套集合进行分组?例如,假设我们有以下嵌套集合; 如何按第一列和第二列中的值对其进行分组?
[ ["A" 2011 "Dan"]
["A" 2011 "Jon"]
["A" 2010 "Tim"]
["B" 2009 "Tom"] ]
所需的结果地图是:
{ A {
2011 [['A', 2011, 'Dan'] ['A', 2011, 'Joe']]
2010 [['A', 2010, 'Tim']]
}
B { 2009 [['B', 2009, 'Tom']] }
}
Run Code Online (Sandbox Code Playgroud)
以下是我的解决方案,几乎可以工作:
(defn nest [data criteria]
(if (empty? criteria)
data
(for [[k v] (group-by #(nth % (-> criteria vals first)) data)]
(hash-map k (nest v (rest criteria))))))
Run Code Online (Sandbox Code Playgroud)
我想出了以下内容:
user=> (def a [["A" 2011 "Dan"]
["A" 2011 "Jon"]
["A" 2010 "Tim"]
["B" 2009 "Tom"] ])
user=> (into {} (for [[k v] (group-by first a)]
[k (group-by second v)]))
{"A" {2011 [["A" 2011 "Dan"]
["A" 2011 "Jon"]],
2010 [["A" 2010 "Tim"]]},
"B" {2009 [["B" 2009 "Tom"]]}}
Run Code Online (Sandbox Code Playgroud)
这是我想出的解决方案。它有效,但我确信它可以改进。
(defn nest [data criteria]
(if (empty? criteria)
data
(into {} (for [[k v] (group-by #(nth % (-> criteria vals first)) data)]
(hash-map k (nest v (rest criteria)))))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |