F: So entfernen / löschen Sie das n-te Element einer Liste.
CAVEAT : Entfernen Sie nicht alle Vorkommen / Elemente, die mit dem n-ten Element übereinstimmen - z . B. eq
oder equal
.
BEISPIEL : Entfernen Sie das 17. Element von:
'(a b c d e f g h i j k l m n o p q r s t u v w x y z)
n. ELEMENT - CHEAT SHEET / LEGENDE :
element 0: a
element 1: b
element 2: c
element 3: d
element 4: e
element 5: f
element 6: g
element 7: h
element 8: i
element 9: j
element 10: k
element 11: l
element 12: m
element 13: n
element 14: o
element 15: p
element 16: q
element 17: r
element 18: s
element 19: t
element 20: u
element 21: v
element 22: w
element 23: x
element 24: y
element 25: z
(cons nil nil)
ist etwas billiger alsgensym
da Sie hier eigentlich kein Symbol benötigen.Hier ist eine einfache Funktion zum Entfernen des n-ten Elements aus einer Liste:
Zwei Anmerkungen: Es erfordert
cl-lib
, und es ist nicht besonders effizient, da es einige Male durch die Liste geht. Letzteres fällt wahrscheinlich nur bei langen Listen auf.Hier sind destruktive und zerstörungsfreie Versionen, die nicht erforderlich sind
cl-lib
(wiederum nicht besonders effizient):quelle
cl-subseq
aus dercl-lib
Bibliothek kommt.nthcdr
Weg geschlagen ;-). Habe es erst auf den zweiten Blick gesehen. Löschte meine Antwort ...Hier ist eine andere zerstörungsfreie Version, die verwendet
cl-loop
:quelle
Hier ist eine Antwort mit nur Rekursion. Zuerst prüfen wir, ob die Liste leer ist. In diesem Fall geben wir die leere Liste zurück. Dann überprüfen wir, ob wir das 0 entfernen te Element der Liste, wobei in diesem Fall alles , was wir das wollen ,
cdr
in der Liste. Wenn wir keinen dieser Basisfälle getroffen haben, wiederholen wir das n-1- te Elementcdr
der Liste und danncons
dascar
der ursprünglichen Liste auf das Ergebnis des rekursiven Aufrufs.Sollte sehr effizient sein. Läuft in linearer Zeit.
quelle
Überrascht zu sehen
cl-delete/remove-if
wurde nicht erwähnt:Dies ist eine lineare Zeit und sollte einigermaßen effizient sein, obwohl ich davon ausgehe , dass sie geringfügig langsamer ist als die Antwort von wvxvw, da sie einige allgemeinere Codepfade durchläuft.
quelle
Ich war mit der akzeptierten Antwort nicht zufrieden, da sie für nth = 0 nicht destruktiv zu sein scheint. Ich habe Folgendes gefunden:
Zerstörungsfreie Version:
seq.el
Funktionen sind neu in Emacs 25.1. In älteren Versionen müssen Sie möglicherweiseDestruktive Version, auch für nth = 0:
quelle
delete-nth-element
kann jedoch nicht "an Ort und Stelle" arbeiten, wennnum
0 ist undlst
eine Liste einer einzelnen ist Element.delete-nth-element
der Tat wird nicht nur ein einzelnes Element gelöscht, sondern durch ersetztnil
, was(nil)
nicht erwartet wird()
. +1.