| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: liste sortieren (2192 mal gelesen)
|
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 19. Sep. 2005 16:08 <-- editieren / zitieren --> Unities abgeben:
hallo! vl-sort liefert mir folgendes ergebnis. (SETQ xl '(("B" "1") ("B" "0") ("B" "1") ("A" "1") ("A" "1") ("G" "0") ("A" "2") ("A" "1") ("A" "2") ("B" "1") ("C" "0") ("C" "3") ("C" "3")) ) (SETQ xl (vl-sort xl (function (lambda (e1 e2) (< (car e1) (car e2)))))) ;ergebnis vl-sort (("A" "1") ("A" "1") ("A" "2") ("A" "1") ("A" "2") ("B" "1") ("B" "0") ("B" "1") ("B" "1") ("C" "0") ("C" "3") ("C" "3") ("G" "0")) ) ich möchte das ergebnis jetzt weiter innerhalb der "listenabschnitte" A B C G nach dem zweiten listeneintrag sortieren. (ähnlich wie in excel). ergebnis nach dem zweiten sortiervorgang (("A" "1") ("A" "1") ("A" "1") ("A" "2") ("A" "2") ("B" "0") ("B" "1") ("B" "1") ("B" "1") ("C" "0") ("C" "3") ("C" "3") ("G" "0")) ) gibt's dafür in lisp eine fertige funktion, oder muss ich die einzelnen abschnitte in einer variablen zwischenspeichern, sortieren und dann wieder zu einer liste zusammenfügen?
ciao georg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 19. Sep. 2005 16:14 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
(SETQ xl (vl-sort (vl-sort xl '(lambda (e1 e2) (< (cadr e1) (cadr e2)))) '(lambda (e1 e2) (< (car e1) (car e2))) ) ) ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangGutke Mitglied Konstrukteur
Beiträge: 109 Registriert: 28.09.2004 AutoCAD 2002 AutoCAD 2006 ObjectDCL 2.02
|
erstellt am: 19. Sep. 2005 16:18 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Versuch es mal hiermit : (vl-sort '(("A" "1") ("A" "1") ("A" "1") ("A" "2") ("A" "2") ("B" "0") ("B" "1") ("B" "1") ("B" "1") ("C" "0") ("C" "3") ("C" "3") ("G" "0")) (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))) VG Wolfgang ------------------ LISP = Lots of Insane Stupid Parantheses Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 19. Sep. 2005 16:27 <-- editieren / zitieren --> Unities abgeben:
danke! @thomas kannst du mir erklären was deine funktion im einzelnen macht. (debugger war nicht sehr aussagekräftig, außer dass zuerst nach dem zweiten und dann nach dem ersten kriterium sortiert wird) ciao georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 19. Sep. 2005 16:31 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
(SETQ xl (vl-sort (vl-sort xl '(lambda (e1 e2) (< (car e1) (car e2)))) '(lambda (e1 e2) (< (cadr e1) (cadr e2))) ) ) das innere (vl-sort xl '(lambda (e1 e2) (< (car e1) (car e2)))) sortiert die Liste xl nach dem ersten Listenelement und liefert eine sortierte Liste zurück, welche gleich die Eingabe des "äußeren" vl-sort ist welches mittels '(lambda (e1 e2) (< (cadr e1) (cadr e2))) nach dem 2. Listenelement sortiert. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 19. Sep. 2005 17:05 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Tag zusammen. Wenn ich mich recht erinnere, dann heißt eine solche Ordnung in Anlehnung an die Sortierung in Lexika oder Wörterbüchern lexikalische Ordnung. Anhand der ersten unterschiedlichen Stelle von vorne wird festgelegt, ob die eine oder die andere Liste kleiner ist. Hierbei sollen kürzere Listen, die in allen Eintägen dem Anfang der Verleichsliste entsprechen als kleiner zu interpretieren. Eine Implementierung in VLisp kann dann so aussehen: Code:
(defun :l-lexiOrder (x y / ) (cond ((and(not x)y));** ist die 1. Liste zuende, die 2. aber nicht --> KLEINER ((or(not x)(not y))nil);** mindestens eine Liste ist zu Ende UND NOT KLEINER --> GRÖßER ODER GLEICH ((<(car x)(car y)));** Treffer: 1. Stellen erfüllen die kanonische Ordnung ((=(car x)(car y));** nächste Stelle prüfen, weil bisher GLEICH (:l-lexiOrder(cdr x)(cdr y)) ) ) )
Die Sortierung der Liste kann dann mit Code: (vl-sort xl':l-lexiOrder)
und das unabh. von der Länge der Listen. Achim Dabrunz ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 21. Sep. 2005 20:19 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
|