如何按 elisp 中的给定索引对列表列表进行分组?列表代表表,如 org-tables,因此每个子列表代表一行,例如。
| a | 1 | 0 |
| b | 1 | 1 |
| c | 0 | 0 |
将是'((a 1 0) (b 1 1) (c 0 0))
。
我希望能够将给定的列按另一列分组。因此,例如,将第一列按第三列分组,我希望'((0 a c) (1 b))
因为第一行和第三行的第三列是 0。
我已经尝试过以下代码,但它会产生很多循环。elisp 中有分组功能还是更好的方法?
;; group column1 by column2 in table
(defun group-by (col1 col2 table)
(let ((vals (cl-remove-duplicates ;find unique values to group by
(cl-loop for row in table
collect (nth col2 row)))))
(cl-loop for val in vals ;for each unique value
collect (cons val (cl-loop for row in table ;check each row for match
when (eq val (nth col2 row))
collect (nth col1 row))))))
(defvar tst-data '((a 1 0) (b 1 1) (c 0 0)))
(group-by 0 2 tst-data)
;; ((1 b)
;; (0 a c))