| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Listenproblem (843 mal gelesen)
|
Rolf Lauer Mitglied
Beiträge: 11 Registriert: 25.07.2008
|
erstellt am: 28. Jul. 2008 20:59 <-- editieren / zitieren --> Unities abgeben:
Hallo, erneut habe ich ein Listenproblem, das ich nicht lösen kann. Vielleicht kann mir jemand helfen. Ich habe eine Liste in AutoLisp wie nachstehend erstellt: (setq liste1 (list 2 1 6 7 3 9 8 6 3 7 4 6 3)) Ich habe versucht, mit folgendem Befehl nur die erste Zahl 3 (nth 4) zu ersetzen durch die Zahl 99. (setq liste1 (subst 99 (nth 4 liste1)liste1)) Daraufhin ersetzte dieser Befehl alle Zahlen 3 mit der Zahl 99. Ich muss aber nur die Zahl an der 4.nth-Stelle ersetzen und nicht alle Zahlen, die genauso sind. In der Literatur steht, dass subst in der gesamten Liste diese Zahl ersetzt. Eine Alternative habe ich nicht gefunden. Daher hoffe ich auf Eure Hilfe. Viele Grüße Rolf
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 28. Jul. 2008 21:30 <-- editieren / zitieren --> Unities abgeben: Nur für Rolf Lauer
Hi Rolf, Da musst Du Dir wohl was für schreiben... Schau Dir dazu doch mal Diese Funktion von Mapcar an. Die entfernt das n'te Element. Jetzt brauchst Du die nur noch ganz geringfügig zu ergänzen... Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rolf Lauer Mitglied
Beiträge: 11 Registriert: 25.07.2008
|
erstellt am: 28. Jul. 2008 23:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Henning, mein Problem liegt daran, dass die Liste in der Anzahl der Elemente nicht verändert werden darf. Lediglich ein einziger Wert an einer bestimmten Stelle muss mit einem anderen Wert ausgetauscht werden. Mit dem Befehl "subst" läuft das nicht. Vielleicht hast Du für mich einen weiteren Tipp. Ich danke Dir im voraus. Rolf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 28. Jul. 2008 23:37 <-- editieren / zitieren --> Unities abgeben: Nur für Rolf Lauer
OK, bin mal nicht so dann mal die Auflösung des Rätsels: nehmen wir mal Axel's Funktion (mit etwas "sprechenderen" Variablen): Code: (defun remove-pos(n liste / dummy) (repeat n (setq dummy (cons (car liste) dummy) liste (cdr liste)) ) (append (reverse dummy) (cdr liste)) )
Da wird das Element an der n'ten Stelle entfernt, indem erst eine neue Liste bis zur Stelle n erstellt, das n'te Element überspungen, und dann mit dem Rest zusammenfügt wird. In Deinem Fall fügst Du dann eben am Ende beim Zusammenfügen das neue Element ein:Code: (defun xchange-pos(n neu liste / dummy) (repeat n (setq dummy (cons (car liste) dummy) liste (cdr liste)) ) (append (reverse dummy) (list neu) (cdr liste)) )
Das meinte ich mit "geringfügig ergänzen"... Alles klar?Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rolf Lauer Mitglied
Beiträge: 11 Registriert: 25.07.2008
|
erstellt am: 29. Jul. 2008 18:34 <-- editieren / zitieren --> Unities abgeben:
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 29. Jul. 2008 20:26 <-- editieren / zitieren --> Unities abgeben: Nur für Rolf Lauer
Hallo Rolf, ich habe gerade gesehen, dass Dir HIER Tom schon vor kurzem mit einem sehr ähnlichen Problem geholfen hat. Du solltest ruhig auch mal versuchen, das Dir anvertraute auch zu verstehen. Die Funktion von Tom (split) teilt eine Liste an der n'ten Stelle auf die gleiche Art, wie (remove-pos) von Axel, nur dass Axel ein Element dann überspringt. Du hättest Dir also eigenllich auch leicht mit der split-funktion die "ersetzen"-Fuktion bauen können: Schritt 1: die Liste an der n'ten Stelle Teilen (split) Schritt 2: neue Liste zusammenbauen, indem Du den zweiten der zurückgegeben Teile (erster Teil = car, 2. Teil = cadr) noch ganz gering modifizierst, indem Du von diesem vor dem Zusammenfügen das erste Element verwirfst: Im Beispiel von Tom dann also so: Code: (setq slst (split lst 5)) (append (car slst) alst (cdr (cadr slst)))
Wenn Dir member und subst subspekt sind, dann schau Dir wenigstens schon mal car, cdr und die zugehörigen Verbindungen an (cadr, cdar, caddr, etc.). Die sind absolute BASICS!. Das hilft auch schon in vielen Fällen (und ist zusätzlich noch rasant schnell.) Also, weiter im Kochbuch lesen... Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 30. Jul. 2008 15:11 <-- editieren / zitieren --> Unities abgeben: Nur für Rolf Lauer
Zitat: Original erstellt von wronzky: Hallo Rolf, ich habe gerade gesehen, dass Dir HIER Tom schon vor kurzem mit einem sehr ähnlichen Problem geholfen hat.
Offenbar besteht die Kunst des Programmierens nicht darin, programmieren zu können, sondern darin, schwierige Probleme auf einfachere Probleme zurück führen zu können. Mit der Split-Funktion hätte der OP sein Problem lösen können, aber dieses Problem geht doch wirklich auch noch einfacher zu lösen: Code:
(defun subst-nth (lst new enth / result) (setq counter 0) (while lst (if (= counter enth) (setq result (cons new result)) (setq result (cons (car lst) result)) ) (setq lst (cdr lst) counter (1+ counter) ) ) (reverse result) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 30. Jul. 2008 15:57 <-- editieren / zitieren --> Unities abgeben: Nur für Rolf Lauer
Aber Tom ???? ... einfacher vielleicht, aber effektiv? - Du läufst immer die gesamte Liste durch, auch wenn das erste Element ausgetauscht werden soll... - Du führst immer und immer wieder einen Vergleich durch... - Du musst einen Zähler aufaddieren... hm... - nein, ich denke die modifizierte remove-pos (= xchange-pos) und auch Deine Split-Funktion sind da doch besser. Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rolf Lauer Mitglied
Beiträge: 11 Registriert: 25.07.2008
|
erstellt am: 30. Jul. 2008 16:09 <-- editieren / zitieren --> Unities abgeben:
Hallo Kollegen, erneut sehr wertvolle Tipps von Euch beiden. Ich bekomme langsam meine Anlaufschwierigkeiten mit den Listen in den Griff. Bekanntlich ist jeder Anfang schwer. An dieser Stelle nochmal DANKE. Gruß Rolf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 30. Jul. 2008 17:28 <-- editieren / zitieren --> Unities abgeben: Nur für Rolf Lauer
Zitat: Original erstellt von wronzky: Aber Tom ???? ... einfacher vielleicht, aber effektiv? - Du läufst immer die gesamte Liste durch, auch wenn das erste Element ausgetauscht werden soll... - Du führst immer und immer wieder einen Vergleich durch... - Du musst einen Zähler aufaddieren...hm... - nein, ich denke die modifizierte remove-pos (= xchange-pos) und auch Deine Split-Funktion sind da doch besser. Grüsse, Henning
Nöö, glaub ich, außer bei sehr langen Listen, nicht - es gibt in LISP kaum eine langsamere Funktion als das APPEND. Aber wenn jemand Lust hat, die Effektivität mal zu testen, dann würde mich das aber schon interessieren - aber ich bin gerade zu faul dazu. Die Liste durchzulaufen, dauert nicht lang - effektiver wäre es aber wohl, (REPEAT (length lst) ...) anstatt WHILE zu verwenden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |