Tampaknya sangat "kotor" mengosongkan daftar dengan cara ini:
while len(alist) > 0 : alist.pop()
Apakah ada cara yang jelas untuk melakukan itu?
Tampaknya sangat "kotor" mengosongkan daftar dengan cara ini:
while len(alist) > 0 : alist.pop()
Apakah ada cara yang jelas untuk melakukan itu?
Jawaban:
Ini sebenarnya menghapus konten dari daftar, tetapi tidak mengganti label lama dengan daftar kosong baru:
del lst[:]
Ini sebuah contoh:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
Demi kelengkapan, tugas irisan memiliki efek yang sama:
lst[:] = []
Itu juga dapat digunakan untuk mengecilkan bagian dari daftar sambil mengganti bagian pada saat yang sama (tapi itu di luar ruang lingkup pertanyaan).
Perhatikan bahwa melakukan lst = []
tidak mengosongkan daftar, hanya membuat objek baru dan mengikatnya ke variabel lst
, tetapi daftar lama akan tetap memiliki elemen yang sama, dan efeknya akan terlihat jelas jika memiliki binding variabel lain.
Jika Anda menjalankan Python 3.3 atau lebih baik, Anda dapat menggunakan clear()
metode list
, yang sejajar dengan clear()
dari dict
, set
, deque
dan jenis kontainer bisa berubah lainnya:
alist.clear() # removes all items from alist (equivalent to del alist[:])
Sesuai halaman dokumentasi yang ditautkan, hal yang sama juga dapat dicapai dengan alist *= 0
.
Singkatnya, ada empat cara yang setara untuk menghapus daftar di tempat (sangat bertentangan dengan Zen Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
Kamu bisa mencoba:
alist[:] = []
Yang berarti: Sambatan dalam daftar []
(0 elemen) di lokasi [:]
(semua indeks dari awal hingga selesai)
[:] Adalah operator slice. Lihat pertanyaan ini untuk informasi lebih lanjut.
alist = []
?
alist
dengan daftar berbeda yang kebetulan kosong. Jika orang lain memiliki referensi ke daftar asli, itu tetap apa adanya (yaitu berisi apa pun yang ada di dalamnya untuk memulai)
alist.clear()
atau alist[:] = []
membantu memeriksa yang alist
benar - benar daftar. Katakanlah Anda alist
kembali dari suatu fungsi foo()
. Anda pikir foo
mengembalikan daftar tetapi memang mengembalikan None
. Menggunakan alist = []
tidak bisa menangkap kesalahan itu.
ternyata dengan python 2.5.2, del l[:]
sedikit lebih lambat dibandingkan l[:] = []
dengan 1.1 usec.
$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
.clear()
, del b[:]
dan b[:]=[]
semua berjalan sama ( b[:]=[]
menjadi sedikit lebih lambat.
lst *= 0
memiliki efek yang sama dengan
lst[:] = []
Ini sedikit lebih sederhana dan mungkin lebih mudah diingat. Selain itu, tidak banyak yang bisa dikatakan
Efisiensi tampaknya hampir sama
0
akan memiliki efek yang sama. Ini adalah trik yang cukup rapi, saya sedikit sedih, bahwa itu tidak mendapat banyak perhatian ..
list = []
akan mengatur ulang list
ke daftar kosong.
Perhatikan bahwa Anda biasanya tidak membayangi nama fungsi yang dicadangkan, seperti list
, yang merupakan konstruktor untuk objek daftar - Anda bisa menggunakan lst
atau list_
sebagai gantinya, misalnya.
list
. Jika Anda mengharapkan fungsi untuk mengubah daftar yang diteruskan (misalnya), ini tidak akan melakukan apa yang Anda inginkan.
Kode sederhana lain yang dapat Anda gunakan (tergantung pada situasi Anda) adalah:
index=len(list)-1
while index>=0:
del list[index]
index-=1
Anda harus memulai indeks pada panjang daftar dan mundur versus indeks pada 0, ke depan karena itu akan membuat Anda berakhir dengan indeks sama dengan panjang daftar dengan hanya memotong setengah.
Juga, pastikan bahwa garis while memiliki tanda "lebih besar atau sama dengan". Mengabaikannya akan meninggalkan Anda dengan daftar [0] yang tersisa.