Nota: Devi essere registrato per poter inserire un messaggio. Per registrarti, clicca qui. La Registrazione è semplice e gratuita!
V I S U A L I Z Z A D I S C U S S I O N E
joseph
Inserito il - 19 febbraio 2012 : 17:02:30 Studiando, in rete, alcuni esempi di merge (concatenazione) e sort (ordinamento) di liste, p.es. List2Lst di Alan J. Thompson e mg.lsp di Claudio Piccini su www.cg-cad.com, ho preso spunto per queste righe di codice, che offre una semplice soluzione alternativa.
Esso permette di fondere un insieme di liste in una lista unica e ordinare gli elementi secondo un criterio; le liste possono avere lunghezza variabile. E' la funzione contraria a quella che spezza una lista in tante liste di lunghezza costante (in ingl. SPLIT).
(setq lst '((2 4) (3 8) (5 1) (4 0 7) (0 5)));lista di liste
(defun LL2L (lst / ret) (while (/= (car lst) (cadr lst)) (setq ret (append ret (car lst) ) lst (cdr lst)) ) (setq ret1 (vl-sort-i ret '<)) (setq ret2 (mapcar '(lambda (x) (nth x ret)) ret1)) )
Se la lista-unione non contiene elementi doppi, è sufficiente sostituire alle ultime 2 righe la seguente: (setq ret1 (vl-sort ret '<)).
Sarebbe interessante conoscere se ci sono altri metodi per raggiungere lo stesso scopo, oltre quelli citati.
3 U L T I M E R I S P O S T E (in alto le più recenti)
Terminator
Inserito il - 19 febbraio 2012 : 21:40:36 Secondo la mia modesta opinione tutto può essere didattico. In questo caso è semplicemente un'evoluzione della stessa funzione usando altri comandi, tutto qui.
joseph
Inserito il - 19 febbraio 2012 : 20:56:43 OK! La mia versione ha una veste semplicemente didattica (questa abitudine non riesco a scrollarmela di dosso), la tua, invece, ha una veste professionale. Saluti.
Terminator
Inserito il - 19 febbraio 2012 : 20:45:12 Beh, così posso essere più stringato:
(setq lst '((2 4) (3 8) (5 1) (4 0 7) (0 5))) ;lista di liste
(defun LL2L (lst / ret)
(setq ret(apply 'append lst)
ret (mapcar '(lambda (x) (nth x ret)) (vl-sort-i ret '<))
)
)