Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Listenproblem

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Listenproblem (839 mal gelesen)
Rolf Lauer
Mitglied



Sehen Sie sich das Profil von Rolf Lauer an!   Senden Sie eine Private Message an Rolf Lauer  Schreiben Sie einen Gästebucheintrag für Rolf Lauer

Beiträge: 11
Registriert: 25.07.2008

erstellt am: 28. Jul. 2008 20:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von wronzky an!   Senden Sie eine Private Message an wronzky  Schreiben Sie einen Gästebucheintrag für wronzky

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Rolf Lauer 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Rolf Lauer an!   Senden Sie eine Private Message an Rolf Lauer  Schreiben Sie einen Gästebucheintrag für Rolf Lauer

Beiträge: 11
Registriert: 25.07.2008

erstellt am: 28. Jul. 2008 23:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von wronzky an!   Senden Sie eine Private Message an wronzky  Schreiben Sie einen Gästebucheintrag für wronzky

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Rolf Lauer 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Rolf Lauer an!   Senden Sie eine Private Message an Rolf Lauer  Schreiben Sie einen Gästebucheintrag für Rolf Lauer

Beiträge: 11
Registriert: 25.07.2008

erstellt am: 29. Jul. 2008 18:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Henning,

Du hast mir entscheidend geholfen, das Problem zu verstehen und zu lösen.

Besten Dank für Deine Hilfe und für Deinen Einsatz.

Gruß
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



Sehen Sie sich das Profil von wronzky an!   Senden Sie eine Private Message an wronzky  Schreiben Sie einen Gästebucheintrag für wronzky

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Rolf Lauer 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 30. Jul. 2008 15:11    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Rolf Lauer 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von wronzky an!   Senden Sie eine Private Message an wronzky  Schreiben Sie einen Gästebucheintrag für wronzky

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Rolf Lauer 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Rolf Lauer an!   Senden Sie eine Private Message an Rolf Lauer  Schreiben Sie einen Gästebucheintrag für Rolf Lauer

Beiträge: 11
Registriert: 25.07.2008

erstellt am: 30. Jul. 2008 16:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 30. Jul. 2008 17:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Rolf Lauer 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz