Saya mengulangi daftar tupel dengan Python, dan saya berusaha menghapusnya jika memenuhi kriteria tertentu.
for tup in somelist:
if determine(tup):
code_to_remove_tup
Apa yang harus saya gunakan sebagai pengganti code_to_remove_tup
? Saya tidak tahu cara menghapus item dengan cara ini.
Jawaban:
Anda dapat menggunakan pemahaman daftar untuk membuat daftar baru yang hanya berisi elemen yang tidak ingin Anda hapus:
Atau, dengan menetapkan ke slice
somelist[:]
, Anda dapat mengubah daftar yang ada untuk hanya berisi item yang Anda inginkan:Pendekatan ini bisa bermanfaat jika ada referensi lain
somelist
yang perlu mencerminkan perubahan.Alih-alih pemahaman, Anda juga bisa menggunakannya
itertools
. Dengan Python 2:Atau dengan Python 3:
Demi kejelasan dan bagi mereka yang menemukan penggunaan
[:]
notasi hackish atau fuzzy, berikut adalah alternatif yang lebih eksplisit. Secara teoritis, itu harus melakukan hal yang sama berkaitan dengan ruang dan waktu daripada satu-liners di atas.Ini juga berfungsi dalam bahasa lain yang mungkin tidak memiliki kemampuan mengganti item dari daftar Python, dengan modifikasi minimal. Misalnya, tidak semua bahasa memberikan daftar kosong ke
False
Python. Anda dapat menggantikanwhile somelist:
sesuatu yang lebih eksplisit sepertiwhile len(somelist) > 0:
.sumber
somelist[:] = (x for x in somelist if determine(x))
ini untuk membuat generator yang mungkin tidak membuat salinan yang tidak perlu.list_ass_slice()
fungsi yang mengimplementasikansomelist[:]=
panggilan secaraPySequence_Fast()
internal. Fungsi ini selalu mengembalikan daftar yaitu, solusi @Alex Martelli yang sudah menggunakan daftar bukan generator yang paling mungkin lebih efisiensomelist
dimutasi dalam kedua metode?Jawaban yang menyarankan pemahaman daftar HAMPIR HAMPIR benar - kecuali bahwa mereka membangun daftar yang sama sekali baru dan kemudian memberi nama yang sama dengan daftar lama, mereka TIDAK mengubah daftar lama di tempat. Itu berbeda dari apa yang akan Anda lakukan dengan penghapusan selektif, seperti dalam saran @ Lennart - lebih cepat, tetapi jika daftar Anda diakses melalui beberapa referensi, fakta bahwa Anda hanya mengulangi salah satu referensi dan TIDAK mengubah objek daftar itu sendiri dapat menyebabkan bug yang halus dan berbahaya.
Untungnya, sangat mudah untuk mendapatkan kecepatan pemahaman daftar DAN semantik yang diperlukan dari perubahan di tempat - cukup kode:
Perhatikan perbedaan halus dengan jawaban lain: yang ini BUKAN menugaskan ke nama bar - itu menugaskan ke daftar slice yang kebetulan menjadi seluruh daftar, dengan demikian mengganti isi daftar dalam objek daftar Python yang sama , bukan hanya mengulangi satu referensi (dari objek daftar sebelumnya ke objek daftar baru) seperti jawaban lainnya.
sumber
a
dengan isi dictb
, gunakana.clear(); a.update(b)
.x = ['foo','bar','baz']; y = x; x = [item for item in x if determine(item)];
Ini menugaskan kembalix
ke hasil pemahaman daftar, tetapiy
masih mengacu pada daftar asli['foo','bar','baz']
. Jika Anda mengharapkanx
dany
merujuk pada daftar yang sama, Anda mungkin telah memperkenalkan bug. Anda mencegah ini dengan menetapkan untuk sepotong seluruh daftar, seperti Alex show, dan saya tunjukkan di sini:x = ["foo","bar","baz"]; y = x; x[:] = [item for item in x if determine(item)];
. Daftar dimodifikasi di tempat. memastikan bahwa semua referensi ke daftar (keduanyax
dan diy
sini) merujuk ke daftar baru.filter
fungsi juga membuat daftar baru, tidak mengubah elemen pada tempatnya ... hanyaolist[:] = [i for i in olist if not dislike(i)]
Anda perlu mengambil salinan daftar dan mengulanginya terlebih dahulu, atau iterasi akan gagal dengan apa yang mungkin hasil yang tidak terduga.
Misalnya (tergantung pada jenis daftar apa):
Sebuah contoh:
sumber
list(somelist)
akan mengubah iterable menjadi daftar.somelist[:]
membuat salinan dari objek yang mendukung pengirisan. Jadi mereka tidak perlu melakukan hal yang sama. Dalam hal ini saya ingin membuat salinansomelist
objek, jadi saya menggunakan[:]
remove()
harus memeriksa daftar SELURUH untuk setiap iterasi, jadi itu akan selamanya.Anda harus mundur jika tidak seperti memotong cabang pohon tempat Anda duduk :-)
Pengguna Python 2: ganti
range
denganxrange
untuk menghindari membuat daftar hardcodedsumber
reversed()
builtinenumerate
mengembalikan iterator danreversed
mengharapkan urutan. Saya kira Anda bisa melakukannyareversed(list(enumerate(somelist)))
jika Anda tidak keberatan membuat daftar tambahan dalam memori.m
lambat.Tutorial Python 2 resmi 4.2. "untuk Pernyataan"
https://docs.python.org/2/tutorial/controlflow.html#for-statements
Bagian dokumen ini memperjelas bahwa:
[:]
Dokumentasi Python 2 7.3. "Pernyataan untuk"
https://docs.python.org/2/reference/compound_stmts.html#for
Bagian dokumen ini mengatakan sekali lagi bahwa Anda harus membuat salinan, dan memberikan contoh penghapusan yang sebenarnya:
Namun, saya tidak setuju dengan implementasi ini, karena
.remove()
harus mengulangi seluruh daftar untuk menemukan nilai.Penanganan terbaik
Antara:
mulai array baru dari awal, dan
.append()
kembali di akhir: https://stackoverflow.com/a/1207460/895245Kali ini efisien, tetapi kurang efisien karena menyimpan salinan array selama iterasi.
gunakan
del
dengan indeks: https://stackoverflow.com/a/1207485/895245Ini lebih hemat ruang karena mengeluarkan salinan array, tetapi kurang efisien waktu karena daftar CPython diimplementasikan dengan array dinamis .
Ini berarti bahwa penghapusan item memerlukan pengalihan semua item berikut kembali menjadi satu, yaitu O (N).
Umumnya Anda hanya ingin memilih
.append()
opsi yang lebih cepat secara default kecuali jika memori adalah masalah besar.Bisakah Python melakukan ini dengan lebih baik?
Sepertinya API Python khusus ini dapat ditingkatkan. Bandingkan, misalnya, dengan:
std::vector::erase
yang mengembalikan interator yang valid ke elemen setelah yang dihapuskeduanya membuatnya sangat jelas bahwa Anda tidak dapat mengubah daftar yang di-iterasi kecuali dengan iterator itu sendiri, dan memberi Anda cara yang efisien untuk melakukannya tanpa menyalin daftar.
Mungkin alasan yang mendasarinya adalah bahwa daftar Python diasumsikan sebagai array dinamis yang didukung, dan oleh karena itu segala jenis penghapusan akan menjadi waktu yang tidak efisien, sementara Java memiliki hierarki antarmuka yang lebih baik dengan keduanya
ArrayList
danLinkedList
implementasi dariListIterator
.Tampaknya tidak ada jenis daftar tertaut eksplisit di stdlib Python baik: Daftar Tertaut Python
sumber
Pendekatan terbaik Anda untuk contoh seperti itu adalah pemahaman daftar
Dalam kasus di mana Anda melakukan sesuatu yang lebih kompleks daripada memanggil suatu
determine
fungsi, saya lebih suka membuat daftar baru dan hanya menambahkannya ketika saya pergi. Sebagai contohMenyalin daftar menggunakan
remove
mungkin membuat kode Anda terlihat sedikit lebih bersih, seperti yang dijelaskan dalam salah satu jawaban di bawah ini. Anda seharusnya tidak melakukan ini untuk daftar yang sangat besar, karena ini melibatkan pertama-tama menyalin seluruh daftar, dan juga melakukanO(n)
remove
operasi untuk setiap elemen yang dihapus, menjadikan ini suatuO(n^2)
algoritma.sumber
Bagi mereka yang suka pemrograman fungsional:
atau
sumber
filter
, dan lebih Pythonic. 2. Jika Anda perlulambda
menggunakanmap
ataufilter
, daftar comp atau genexpr selalu merupakan opsi yang lebih baik;map
danfilter
bisa menjadi sedikit lebih cepat ketika fungsi transformasi / predikat adalah built-in Python diimplementasikan dalam C dan iterable tidak kecil, tapi mereka selalu lebih lambat ketika Anda membutuhkanlambda
yang listcomp / genexpr bisa hindari.Saya perlu melakukan ini dengan daftar besar, dan menduplikasi daftar itu tampak mahal, terutama karena dalam kasus saya jumlah penghapusan akan sedikit dibandingkan dengan item yang tersisa. Saya mengambil pendekatan tingkat rendah ini.
Yang saya tidak tahu adalah seberapa efisien beberapa penghapusan dibandingkan dengan menyalin daftar besar. Berikan komentar jika Anda memiliki wawasan.
sumber
list
sebagai struktur data di tempat pertama harus dipertimbangkan dengan hati-hati karena penghapusan dari tengah daftar membutuhkan waktu linier dalam panjang daftar. Jika Anda tidak benar-benar membutuhkan akses acak ke item sekuensial k-th, mungkin pertimbangkanOrderedDict
?newlist = []
, lalunewlist.append(array[i])
sebelum itudel array[i]
?list()
daftar yang ditautkan, akses acak mahal, jikalist()
array, penghapusan mahal karena mereka perlu untuk memajukan semua elemen berikut. Iterator yang layak dapat membuat hal-hal yang baik untuk implementasi daftar tertaut. Namun ini bisa menghemat ruang.Mungkin pintar juga membuat daftar baru jika item daftar saat ini memenuhi kriteria yang diinginkan.
begitu:
dan untuk menghindari kode ulang seluruh proyek dengan nama daftar baru:
perhatikan, dari dokumentasi Python:
sumber
Jawaban ini awalnya ditulis sebagai jawaban atas pertanyaan yang telah ditandai sebagai duplikat: Menghapus koordinat dari daftar di python
Ada dua masalah dalam kode Anda:
1) Saat menggunakan remove (), Anda mencoba menghapus integer sedangkan Anda perlu menghapus tuple.
2) Loop for akan melewatkan item dalam daftar Anda.
Mari kita jalankan apa yang terjadi ketika kami mengeksekusi kode Anda:
Masalah pertama adalah Anda memberikan 'a' dan 'b' untuk menghapus (), tetapi menghapus () hanya menerima argumen tunggal. Jadi bagaimana kami bisa menghapus () agar berfungsi dengan baik dengan daftar Anda? Kami perlu mencari tahu apa setiap elemen daftar Anda. Dalam hal ini, masing-masing adalah tuple. Untuk melihat ini, mari kita akses satu elemen daftar (pengindeksan dimulai pada 0):
Aha! Setiap elemen L1 sebenarnya adalah tuple. Jadi itu yang harus kita lewati untuk menghapus (). Tuple dalam python sangat mudah, mereka hanya dibuat dengan menyertakan nilai dalam tanda kurung. "a, b" bukan tuple, tapi "(a, b)" adalah tuple. Jadi kami memodifikasi kode Anda dan menjalankannya lagi:
Kode ini berjalan tanpa kesalahan, tetapi mari kita lihat daftar yang dihasilkannya:
Mengapa (1, -2) masih ada di daftar Anda? Ternyata memodifikasi daftar sambil menggunakan loop untuk beralih lebih dari itu adalah ide yang sangat buruk tanpa perawatan khusus. Alasan bahwa (1, -2) tetap dalam daftar adalah bahwa lokasi setiap item dalam daftar berubah antara iterasi dari for loop. Mari kita lihat apa yang terjadi jika kita memberi kode yang lebih panjang pada daftar di atas:
Seperti yang dapat Anda simpulkan dari hasil itu, setiap kali pernyataan bersyarat mengevaluasi ke true dan item daftar dihapus, iterasi loop berikutnya akan melewati evaluasi item berikutnya dalam daftar karena nilainya sekarang berada di indeks yang berbeda.
Solusi paling intuitif adalah menyalin daftar, kemudian beralih ke daftar asli dan hanya memodifikasi salinan. Anda dapat mencoba melakukannya seperti ini:
Namun, hasilnya akan sama dengan sebelumnya:
Ini karena ketika kita membuat L2, python tidak benar-benar membuat objek baru. Sebaliknya, itu hanya mereferensikan L2 ke objek yang sama dengan L1. Kami dapat memverifikasi ini dengan 'is' yang berbeda dari sekadar "sama dengan" (==).
Kita dapat membuat salinan yang benar menggunakan copy.copy (). Kemudian semuanya berfungsi seperti yang diharapkan:
Akhirnya, ada satu solusi yang lebih bersih daripada harus membuat salinan L1 yang sama sekali baru. Fungsi terbalik ():
Sayangnya, saya tidak bisa menjelaskan cara membalikkan () bekerja. Ini mengembalikan objek 'listreverseiterator' ketika daftar diteruskan ke sana. Untuk tujuan praktis, Anda dapat menganggapnya sebagai membuat salinan argumennya yang terbalik. Ini solusi yang saya rekomendasikan.
sumber
Jika Anda ingin melakukan hal lain selama iterasi, mungkin lebih baik untuk mendapatkan kedua indeks (yang menjamin Anda dapat referensi itu, misalnya jika Anda memiliki daftar dicts) dan isi item daftar yang sebenarnya.
enumerate
memberi Anda akses ke item dan indeks sekaligus.reversed
adalah agar indeks yang akan Anda hapus nanti tidak berubah pada Anda.sumber
Anda mungkin ingin menggunakan
filter()
tersedia sebagai bawaan.Untuk lebih jelasnya cek di sini
sumber
Sebagian besar jawaban di sini ingin Anda membuat salinan daftar. Saya memiliki kasus penggunaan di mana daftarnya cukup panjang (110 ribu item) dan lebih pintar untuk terus mengurangi daftarnya.
Pertama-tama Anda harus mengganti foreach loop dengan while ,
Nilai
i
tidak berubah di blok if karena Anda ingin mendapatkan nilai item baru dari indeks yang sama, setelah item lama dihapus.sumber
Anda dapat mencoba untuk mengulang secara terbalik sehingga untuk some_list Anda akan melakukan sesuatu seperti:
Dengan cara ini indeks selaras dan tidak mengalami pembaruan daftar (terlepas apakah Anda pop elemen atau tidak).
sumber
reversed(list(enumerate(some_list)))
akan lebih mudah daripada menghitung indeks sendiri.Salah satu solusi yang mungkin, berguna jika Anda ingin tidak hanya menghapus beberapa hal, tetapi juga melakukan sesuatu dengan semua elemen dalam satu loop:
sumber
bad
sesuatu, melakukan sesuatu dengannya dan juga melakukan sesuatu dengangood
sesuatu dalam satu lingkaran?alist[:]
) Dan karena Anda mungkin melakukan sesuatu yang mewah, itu sebenarnya memiliki use case. Revisi bagus itu bagus. Ambil upvote saya.Saya perlu melakukan sesuatu yang serupa dan dalam kasus saya masalahnya adalah memori - saya perlu menggabungkan beberapa objek dataset dalam daftar, setelah melakukan beberapa hal dengan mereka, sebagai objek baru, dan perlu menyingkirkan setiap entri yang saya gabungkan. hindari menduplikasi semuanya dan meledakkan memori. Dalam kasus saya memiliki objek dalam kamus, bukan daftar berfungsi dengan baik:
`` `
`` `
sumber
TLDR:
Saya menulis perpustakaan yang memungkinkan Anda melakukan ini:
Cara terbaik adalah menggunakan metode lain jika mungkin yang tidak mengharuskan Anda memodifikasi iterable saat iterating di atasnya, tetapi untuk beberapa algoritma mungkin tidak semudah itu. Dan jika Anda yakin benar-benar menginginkan pola kode yang dijelaskan dalam pertanyaan awal, itu mungkin.
Harus bekerja pada semua urutan yang bisa berubah, bukan hanya daftar.
Jawaban lengkap:
Sunting: Contoh kode terakhir dalam jawaban ini memberikan kasus penggunaan mengapa Anda kadang-kadang ingin mengubah daftar di tempat daripada menggunakan pemahaman daftar. Bagian pertama dari jawaban berfungsi sebagai tutorial tentang bagaimana sebuah array dapat dimodifikasi di tempat.
Solusinya mengikuti dari ini jawaban (untuk pertanyaan terkait) dari pengirim. Yang menjelaskan bagaimana indeks array diperbarui saat iterasi melalui daftar yang telah dimodifikasi. Solusi di bawah ini dirancang untuk melacak indeks array dengan benar bahkan jika daftar diubah.
Unduh
fluidIter.py
dari sinihttps://github.com/alanbacon/FluidIterator
, hanya satu file sehingga tidak perlu menginstal git. Tidak ada installer sehingga Anda perlu memastikan bahwa file tersebut ada di jalur python diri Anda. Kode telah ditulis untuk python 3 dan belum diuji pada python 2.Ini akan menghasilkan output berikut:
Di atas kami telah menggunakan
pop
metode pada objek daftar cairan. Metode iterable umum lainnya juga dilaksanakan sepertidel fluidL[i]
,.remove
,.insert
,.append
,.extend
. Daftar ini juga dapat dimodifikasi menggunakan irisan (sort
danreverse
metode tidak diterapkan).Satu-satunya syarat adalah Anda hanya harus mengubah daftar di tempat, jika pada titik
fluidL
ataul
dipindahkan ke objek daftar yang berbeda kode tidak akan berfungsi.fluidL
Objek asli masih akan digunakan oleh for loop tetapi akan menjadi di luar ruang bagi kita untuk memodifikasi.yaitu
Jika kita ingin mengakses nilai indeks saat ini dari daftar kita tidak bisa menggunakan penghitungan, karena ini hanya menghitung berapa kali loop for telah berjalan. Sebaliknya kita akan menggunakan objek iterator secara langsung.
Ini akan menampilkan yang berikut:
The
FluidIterable
kelas hanya menyediakan pembungkus untuk asli daftar objek. Objek asli dapat diakses sebagai properti dari objek fluida seperti:Lebih banyak contoh / tes dapat ditemukan di
if __name__ is "__main__":
bagian di bagian bawahfluidIter.py
. Ini layak untuk dilihat karena menjelaskan apa yang terjadi dalam berbagai situasi. Seperti: Mengganti sebagian besar daftar menggunakan irisan. Atau menggunakan (dan memodifikasi) iterable yang sama di nested for loop.Seperti yang saya nyatakan di awal: ini adalah solusi rumit yang akan mengganggu keterbacaan kode Anda dan membuatnya lebih sulit untuk di-debug. Karena itu solusi lain seperti daftar pemahaman yang disebutkan dalam jawaban David Raznick harus dipertimbangkan terlebih dahulu. Yang sedang berkata, saya telah menemukan saat-saat di mana kelas ini bermanfaat bagi saya dan lebih mudah digunakan daripada melacak indeks elemen-elemen yang perlu dihapus.
Sunting: Seperti yang disebutkan dalam komentar, jawaban ini tidak benar-benar menimbulkan masalah dimana pendekatan ini memberikan solusi. Saya akan mencoba mengatasinya di sini:
Pemahaman daftar menyediakan cara untuk menghasilkan daftar baru tetapi pendekatan ini cenderung melihat setiap elemen secara terpisah daripada keadaan saat ini daftar secara keseluruhan.
yaitu
Tetapi bagaimana jika hasil dari
testFunc
tergantung pada elemen yang telah ditambahkannewList
? Atau elemen-elemennya masih adaoldList
yang mungkin ditambahkan selanjutnya? Mungkin masih ada cara untuk menggunakan pemahaman daftar tetapi akan mulai kehilangan keanggunannya, dan bagi saya rasanya lebih mudah untuk memodifikasi daftar di tempat.Kode di bawah ini adalah salah satu contoh algoritma yang mengalami masalah di atas. Algoritma akan mengurangi daftar sehingga tidak ada elemen yang merupakan kelipatan dari elemen lainnya.
Output dan daftar pengurangan akhir ditunjukkan di bawah ini
sumber
some_list[:] = [x for x in some_list if not some_condition(x)]
tidak tercapai? Tanpa jawaban untuk itu, mengapa ada yang percaya bahwa mengunduh dan menggunakan perpustakaan 600-line Anda lengkap dengan kesalahan ketik dan kode komentar adalah solusi yang lebih baik untuk masalah mereka daripada one-liner? -1.some_list[:] = [x for x in some_list if not some_condition(y)]
manay
elemen daftar berbedax
. Juga tidak mungkin untuk menulissome_list[:] = [x for x in some_list if not some_condition(intermediateStateOf_some_list)]
.Metode yang paling efektif adalah daftar pemahaman, banyak orang menunjukkan kasus mereka, tentu saja, itu juga merupakan cara yang baik untuk mendapatkan
iterator
melaluifilter
.Ada sebuah contoh (dapatkan peluang di tuple):
Perhatian: Anda juga tidak bisa menangani iterator. Iterator terkadang lebih baik daripada urutan.
sumber
untuk loop akan beralih melalui indeks ..
menganggap Anda memiliki daftar,
Anda telah menggunakan variabel daftar yang dipanggil
lis
. dan Anda menggunakan yang sama untuk menghapus ..variabel Anda
selama 5 iterasi,
Anda nomor 35 itu tidak prima sehingga Anda dihapus dari daftar.
dan kemudian nilai selanjutnya (65) beralih ke indeks sebelumnya.
jadi iterasi ke-4 dilakukan pointer pindah ke 5 ..
Itulah mengapa loop Anda tidak mencakup 65 sejak dipindahkan ke indeks sebelumnya.
jadi Anda tidak harus merujuk daftar ke variabel lain yang masih referensi asli daripada salinan.
begitu juga salinan daftar menggunakan
list[::]
sekarang kamu akan memberi,
Masalahnya adalah Anda menghapus nilai dari daftar selama iterasi maka indeks daftar Anda akan runtuh.
jadi Anda bisa mencoba pemahaman sebagai gantinya.
yang mendukung semua iterable seperti, daftar, tuple, dict, string dll
sumber
Jika Anda ingin menghapus elemen dari daftar saat iterasi, gunakan loop-sementara sehingga Anda dapat mengubah indeks saat ini dan indeks akhir setelah setiap penghapusan.
Contoh:
sumber
Jawaban lainnya benar bahwa biasanya ide buruk dihapus dari daftar yang Anda iterasi. Membalikkan iterasi menghindari jebakan, tetapi jauh lebih sulit untuk mengikuti kode yang melakukan itu, jadi biasanya Anda lebih baik menggunakan daftar pemahaman atau
filter
.Namun, ada satu kasus di mana aman untuk menghapus elemen dari urutan yang Anda iterasi: jika Anda hanya menghapus satu item saat Anda iterasi. Ini dapat dipastikan menggunakan a
return
atau abreak
. Sebagai contoh:Ini seringkali lebih mudah dipahami daripada pemahaman daftar ketika Anda melakukan beberapa operasi dengan efek samping pada item pertama dalam daftar yang memenuhi beberapa kondisi dan kemudian menghapus item itu dari daftar segera setelahnya.
sumber
Saya dapat memikirkan tiga pendekatan untuk menyelesaikan masalah Anda. Sebagai contoh, saya akan membuat daftar tuple secara acak
somelist = [(1,2,3), (4,5,6), (3,6,6), (7,8,9), (15,0,0), (10,11,12)]
. Kondisi yang saya pilih adalahsum of elements of a tuple = 15
. Dalam daftar terakhir kita hanya akan memiliki tupel-tupel yang jumlahnya tidak sama dengan 15.Apa yang saya pilih adalah contoh yang dipilih secara acak. Jangan ragu untuk mengubah dalam daftar tupel dan kondisi yang saya telah memilih.
Metode 1.> Gunakan kerangka kerja yang Anda sarankan (di mana seseorang mengisi kode di dalam for for loop). Saya menggunakan kode kecil dengan
del
untuk menghapus tuple yang memenuhi kondisi tersebut. Namun, metode ini akan kehilangan tupel (yang memenuhi kondisi tersebut) jika dua tupel yang ditempatkan secara berurutan memenuhi kondisi yang diberikan.Metode 2.> Buat daftar baru yang berisi elemen (tuple) di mana kondisi yang diberikan tidak terpenuhi (ini adalah hal yang sama dengan menghapus elemen daftar di mana kondisi yang diberikan terpenuhi). Berikut ini adalah kode untuk itu:
Metode 3.> Temukan indeks di mana kondisi yang diberikan terpenuhi, dan kemudian gunakan elemen hapus (tupel) yang sesuai dengan indeks tersebut. Berikut ini adalah kode untuk itu.
Metode 1 dan metode 2 lebih cepat dari metode 3 . Metode2 dan metode3 lebih efisien daripada metode1. Saya lebih suka metode2 . Untuk contoh di atas,
time(method1) : time(method2) : time(method3) = 1 : 1 : 1.7
sumber
Untuk apa pun yang berpotensi menjadi sangat besar, saya menggunakan yang berikut ini.
Itu harusnya jauh lebih cepat dari yang lainnya.
sumber
Dalam beberapa situasi, saat Anda melakukan lebih dari sekadar memfilter daftar item satu per satu, Anda ingin iterasi Anda berubah saat iterasi.
Berikut adalah contoh di mana menyalin daftar sebelumnya salah, iterasi terbalik tidak mungkin dan pemahaman daftar juga bukan pilihan.
sumber
Jika Anda akan menggunakan daftar baru nanti, Anda bisa mengatur elem ke Tidak ada, dan kemudian menilai di loop kemudian, seperti ini
Dengan cara ini, Anda tidak perlu menyalin daftar dan lebih mudah dimengerti.
sumber
susun daftar nomor dan Anda ingin menghapus semua tidak ada yang habis dibagi 3,
menggunakan
list comprehension
, ini akan membuat daftar baru dan membuat ruang memori barumenggunakan
lambda filter
fungsi, ini akan membuat daftar baru yang dihasilkan dan mengkonsumsi ruang memeorytanpa menghabiskan ruang memori untuk daftar baru dan memodifikasi daftar yang ada
sumber