如何根据给定标准对嵌套集合进行分组?

Ari*_*Ari 6 clojure

如何根据动态给出的列值对嵌套集合进行分组?例如,假设我们有以下嵌套集合; 如何按第一列和第二列中的值对其进行分组?

[ ["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)

Jon*_*nas 6

我想出了以下内容:

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)


Ari*_*Ari 1

这是我想出的解决方案。它有效,但我确信它可以改进。

(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)