P: Como remover / excluir o enésimo elemento de uma lista.
CAVEAT : Do não remover todas as ocorrências / membros correspondentes enésimo elemento - por exemplo, eq
ou equal
.
EXEMPLO : Remova o 17º elemento 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)
enésimo ELEMENTO - FOLHA DE TRABALHO / LEGENDA :
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)
é um pouco mais barato do quegensym
já que você não precisa de um símbolo aqui.Aqui está uma função simples para remover o enésimo elemento de uma lista:
Duas notas: requer
cl-lib
e não é muito eficiente, pois percorre a lista algumas vezes. O último provavelmente é perceptível apenas para listas longas.Aqui estão as versões destrutivas e não destrutivas que não exigem
cl-lib
(novamente, não são terrivelmente eficientes):fonte
cl-subseq
partir dacl-lib
biblioteca.nthcdr
caminho ;-). Só o vi pela segunda vez. Excluiu minha resposta ...Aqui está outra versão não destrutiva que usa
cl-loop
:fonte
Aqui está uma resposta usando apenas recursão. Primeiro, verificamos se a lista está vazia; nesse caso, retornamos a lista vazia. Em seguida, verificamos se estamos removendo o 0º elemento da lista; nesse caso, tudo o que queremos é o
cdr
da lista. Se não atingimos um desses casos base, recorremos removendo o n- ésimo elemento dacdr
lista e, em seguida,cons
ocar
da lista original no resultado da chamada recursiva.Deve ser muito eficiente. É executado em tempo linear.
fonte
Surpreso ao ver
cl-delete/remove-if
não foi mencionado:Este é um tempo linear e deve ser razoavelmente eficiente, embora eu espere um pouco mais lento do que a resposta do wvxvw, à medida que ele passa por alguns caminhos de código mais genéricos.
fonte
Eu não estava feliz com a resposta aceita, porque não parece ser destrutivo para nésimo = 0. Eu vim com o seguinte:
Versão não destrutiva:
seq.el
funções são novas no emacs 25.1. Nas versões mais antigas, pode ser necessárioVersão destrutiva, mesmo para enésimo = 0:
fonte
delete-nth-element
não pode funcionar "no local" no caso em quenum
é 0 elst
é uma lista de uma única elemento.delete-nth-element
, não apenas exclui um único elemento, mas o substitui pornil
, terminando com em(nil)
vez do esperado()
. +1.