Wie kann ich eine Liste von Listen nach einem bestimmten Index in elisp gruppieren? Die Listen stellen Tabellen wie Org-Tabellen dar, so dass jede Unterliste eine Zeile darstellt, z.Gruppentabellen oder Listen von Listen nach Index
| a | 1 | 0 |
| b | 1 | 1 |
| c | 0 | 0 |
wäre '((a 1 0) (b 1 1) (c 0 0))
.
Ich möchte in der Lage sein, dann eine bestimmte Spalte durch eine andere Spalte zu gruppieren. Also, zum Beispiel, Gruppierung der ersten Spalte durch die dritte, würde ich '((0 a c) (1 b))
erwarten, da die dritte Spalte der ersten und dritten Zeile ist 0.
Ich habe den folgenden Code versucht, aber es machen so viele Schleifen. Gibt es eine Gruppierungsfunktion in elisp oder besser?
;; 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))
Wenn die Assoziationslistenlösung nicht funktioniert, können Sie stattdessen auch Hashtabellen oder nur etwas anderes als Lisp verwenden, wenn Ihnen diese zur Verfügung steht. – ashawley