Sekarang saya tahu bahwa tidak aman untuk mengubah daftar selama perulangan berulang. Namun, anggaplah saya memiliki daftar string, dan saya ingin menghapus string sendiri. Apakah penggantian nilai yang dapat diubah dianggap sebagai modifikasi?
178
Jawaban:
Itu dianggap bentuk yang buruk. Gunakan pemahaman daftar sebagai gantinya, dengan tugas irisan jika Anda perlu mempertahankan referensi yang ada ke daftar.
sumber
print b
pernyataan dijalankan, Anda dapat mengetahui apakaha
telah dimodifikasi di tempat daripada diganti. Kemungkinan lain adalahprint b is a
melihat apakah keduanya masih merujuk pada objek yang sama.Karena loop di bawah ini hanya memodifikasi elemen yang sudah dilihat, itu akan dianggap dapat diterima:
Yang berbeda dari:
dalam hal itu tidak memerlukan pembuatan daftar sementara dan penugasan untuk menggantikan yang asli, meskipun itu membutuhkan lebih banyak operasi pengindeksan.
Perhatian: Meskipun Anda dapat memodifikasi entri dengan cara ini, Anda tidak dapat mengubah jumlah item
list
tanpa mempertaruhkan peluang menghadapi masalah.Inilah contoh yang saya maksud — menghapus entri mengacaukan pengindeksan sejak saat itu:
(Hasilnya salah karena tidak menghapus semua item yang seharusnya.)
Memperbarui
Karena ini adalah jawaban yang cukup populer, berikut ini cara menghapus entri "di tempat" secara efektif (meskipun itu bukan pertanyaan):
sumber
for i in a
? Ini sangat berlawanan dengan intuisi, tampaknya berbeda dari bahasa lain dan telah mengakibatkan kesalahan pada kode saya sehingga saya harus melakukan debug untuk jangka waktu yang lama. Tutorial Python bahkan tidak menyebutkannya. Meskipun harus ada alasan untuk itu?a[i]
dans
) untuk objek yang sama di baris yang sama ketika Anda tidak perlu? Saya lebih suka melakukannyaa[i] = a[i].strip()
.a[i] = s.strip()
hanya satu operasi pengindeksan.enumerate(b)
melakukan operasi pengindeksan pada setiap iterasi dan Anda melakukannya dengan yang laina[i] =
. AFAIK tidak mungkin untuk mengimplementasikan loop ini dalam Python dengan hanya 1 operasi pengindeksan per loop iterasi :(Satu lagi untuk varian loop, terlihat lebih bersih bagi saya daripada satu dengan enumerate ():
sumber
range(len(list))
di Python sebagai bau kode.enumerate
generator itu tidak membuat daftar. Dari tupel, itu membuat mereka satu per satu saat iterates melalui daftar. Satu-satunya cara untuk mengetahui mana yang lebih lambat adalah dengantimeit
.timeit
enumerate
lebih lambatMemodifikasi setiap elemen saat iterasi daftar baik-baik saja, selama Anda tidak mengubah menambah / menghapus elemen ke daftar.
Anda dapat menggunakan pemahaman daftar:
atau lakukan saja
C-style
for loop:sumber
Tidak, Anda tidak akan mengubah "konten" daftar, jika Anda dapat mengubah string dengan cara itu. Tetapi dalam Python mereka tidak bisa berubah. Operasi string apa pun mengembalikan string baru.
Jika Anda memiliki daftar objek yang Anda tahu bisa berubah, Anda bisa melakukan ini selama Anda tidak mengubah konten sebenarnya dari daftar.
Dengan demikian Anda perlu melakukan semacam peta. Jika Anda menggunakan ekspresi generator itu [operasi] akan dilakukan saat Anda mengulanginya dan Anda akan menghemat memori.
sumber
Anda dapat melakukan sesuatu seperti ini:
Ini disebut pemahaman daftar, untuk membuatnya lebih mudah bagi Anda untuk masuk ke dalam daftar.
sumber
Jawaban yang diberikan oleh Jemshit Iskenderov dan Ignacio Vazquez-Abrams sangat bagus. Lebih lanjut dapat diilustrasikan dengan contoh ini: bayangkan itu
a) Daftar dengan dua vektor diberikan kepada Anda;
b) Anda ingin melintasi daftar dan membalikkan urutan masing-masing array
Katakanlah Anda punya
Kamu akan mendapatkan
Di sisi lain, jika Anda melakukannya
Hasilnya adalah
sumber
Tidak jelas dari pertanyaan Anda apa kriteria untuk memutuskan string apa yang harus dihapus, tetapi jika Anda memiliki atau dapat membuat daftar string yang ingin Anda hapus, Anda dapat melakukan hal berikut:
yang mengubah my_strings menjadi ['a', 'c', 'e']
sumber
Singkatnya, untuk melakukan modifikasi pada daftar sambil mengulangi daftar yang sama.
contoh:
sumber