Re: Collecting like-labelled sublists of a list
- From: Madhu <enometh@xxxxxxxx>
- Date: Wed, 30 Jul 2008 20:09:00 +0530
* Cortez <712195e4-2e38-4b2f-97bd-48fe7b2f7af1@xxxxxxxxxxxxxxxxxxxxxxxxxxx> :
Wrote on Tue, 29 Jul 2008 11:24:02 -0700 (PDT):
|> (defun test (list)
|> (loop for j in list
|> for index = (first j)
|> for k = (rest j)
|> with indices = nil
|> if (not (member index indices))
|> do (pushnew index indices)
|> and collect j into res
|> else
|> do (nconc (assoc index res) k) ; ASSOC instead of NTH
|> finally (return res)))
|
| To be more precise (if that helps), I'm wondering if there's a way of
| doing this without having to build up a list of the indices (labels)
| and using membership/non-membership of this list as the test for
| whether we have encountered a new index or not.
You can get by without building indices and just using ASSOC (which you
cannot avoid):
(defun cortez-group (list) ; Destroys LIST!
(let (result)
(dolist (el list)
(let ((entry (assoc (car el) result)))
(if entry
(rplacd entry (nconc (cdr entry) (cdr el)))
(push el result))))
(nreverse (mapcar #'cdr result))))
* (setq $a '((0 a b) (1 c d) (2 e f) (3 g h) (1 i j)
(2 k l) (4 m n) (2 o p) (4 q r) (5 s t)))
* (cortez-group $a)
=> ((A B) (C D I J) (E F K L O P) (G H) (M N Q R) (S T))
If you want the value to be sorted by label, consider sorting RESULT
:KEY #'CAR.
--
Madhu
.
- References:
- Collecting like-labelled sublists of a list
- From: Cortez
- Re: Collecting like-labelled sublists of a list
- From: Cortez
- Re: Collecting like-labelled sublists of a list
- From: Cortez
- Collecting like-labelled sublists of a list
- Prev by Date: Re: Strange behaviour of *standard-output* in sbcl
- Next by Date: Re: Lisp based DSL for bio on Ars Technica
- Previous by thread: Re: Collecting like-labelled sublists of a list
- Next by thread: Re: Collecting like-labelled sublists of a list
- Index(es):