Q: Comment supprimer / supprimer le nième élément d'une liste.
CAVEAT : Ne supprimez pas toutes les occurrences / membres correspondant au nième élément - par exemple, eq
ou equal
.
EXEMPLE : Supprimer le 17e élément de:
'(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)
nième ÉLÉMENT - TRICHE / LÉGENDE :
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)
est un peu moins chère quegensym
puisque vous n'avez pas vraiment besoin d'un symbole ici.Voici une fonction simple pour supprimer le nième élément d'une liste:
Deux remarques: cela nécessite
cl-lib
, et ce n'est pas terriblement efficace, car il parcourt la liste plusieurs fois. Ce dernier n'est probablement perceptible que pour les longues listes.Voici des versions destructives et non destructives qui ne nécessitent pas
cl-lib
(encore une fois, pas terriblement efficaces):la source
cl-subseq
partir de lacl-lib
bibliothèque.nthcdr
-way ;-). Je ne l'ai vu qu'au deuxième coup d'œil. Supprimé ma réponse ...Voici une autre version non destructive qui utilise
cl-loop
:la source
Voici une réponse utilisant simplement la récursivité. Nous vérifions d'abord si la liste est vide, auquel cas nous renvoyons la liste vide. Ensuite, nous vérifions si nous supprimons le 0 ème élément de la liste, auquel cas tout ce que nous voulons est le
cdr
de la liste. Si nous n'avons pas atteint l'un de ces cas de base, nous répétons en supprimant le n-1 ème élémentcdr
de la liste, puiscons
lecar
de la liste d'origine sur le résultat de l'appel récursif.Devrait être très efficace. Fonctionne en temps linéaire.
la source
Surpris de voir
cl-delete/remove-if
n'a pas été mentionné:C'est un temps linéaire et devrait être raisonnablement efficace, bien que je m'attende à un peu plus lentement que la réponse de wvxvw car elle passe par des chemins de code plus génériques.
la source
Je n'étais pas satisfait de la réponse acceptée car elle ne semble pas être destructrice pour nth = 0. J'ai trouvé ce qui suit:
Version non destructive:
seq.el
les fonctions sont nouvelles dans emacs 25.1. Dans les anciennes versions, vous devrez peut-êtreVersion destructrice, même pour nième = 0:
la source
delete-nth-element
ne peut pas fonctionner "sur place" dans le cas oùnum
est 0 etlst
est une liste d'un seul élément.delete-nth-element
non seulement supprimer un seul élément, mais plutôt le remplacer parnil
, se terminant par au(nil)
lieu de prévu()
. +1.