T: Cara menghapus / menghapus elemen ke-n dari daftar.
Peringatan : Do tidak menghapus semua kejadian / anggota pencocokan elemen ke-n - misalnya, eq
atau equal
.
CONTOH : Hapus elemen ke-17 dari:
'(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)
UNSUR n - LEMBAR / LEGENDA CHEAT :
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)
sedikit lebih murah daripadagensym
karena Anda sebenarnya tidak memerlukan simbol di sini.Berikut adalah fungsi sederhana untuk menghapus elemen ke-n dari daftar:
Dua catatan: itu membutuhkan
cl-lib
, dan itu tidak terlalu efisien, karena berjalan melalui daftar beberapa kali. Yang terakhir mungkin hanya terlihat untuk daftar panjang.Berikut adalah versi destruktif dan non-destruktif yang tidak memerlukan
cl-lib
(sekali lagi, tidak terlalu efisien):sumber
cl-subseq
daricl-lib
perpustakaan.nthcdr
cara ;-). Apakah hanya melihatnya pada pandangan kedua. Menghapus jawaban saya ...Berikut ini adalah versi non-destruktif lain yang menggunakan
cl-loop
:sumber
Inilah jawaban menggunakan rekursi saja. Pertama kita periksa untuk melihat apakah daftar itu kosong, dalam hal ini kita mengembalikan daftar kosong. Kemudian kita periksa untuk melihat apakah kita menghapus elemen ke- 0 dari daftar, dalam hal ini yang kita inginkan adalah
cdr
daftar. Jika kita tidak memukul salah satu kasus dasar, kita kambuh dengan menghapus n-1 th elemen daricdr
daftar, dan kemudiancons
yangcar
dari daftar asli ke hasil dari panggilan rekursif.Harus sangat efisien. Berjalan dalam waktu linier.
sumber
Terkejut melihat
cl-delete/remove-if
tidak disebutkan:Ini adalah waktu linier, dan harusnya cukup efisien, meskipun saya perkirakan sedikit lebih lambat daripada jawaban wvxvw saat melewati beberapa codepath yang lebih umum.
sumber
Saya tidak senang dengan jawaban yang diterima karena sepertinya tidak merusak untuk n = = 0. Saya datang dengan yang berikut:
Versi tidak merusak:
seq.el
fungsi baru di emacs 25.1. Dalam versi yang lebih lama Anda mungkin perluVersi destruktif, bahkan untuk n = 0:
sumber
delete-nth-element
tidak dapat bekerja "di tempat" dalam kasus di mananum
0 danlst
merupakan daftar satu elemen.delete-nth-element
tidak hanya menghapus satu elemen tetapi menggantikannya dengannil
, berakhir dengan(nil)
bukannya yang diharapkan()
. +1.