Apa cara pythonic dalam menulis kode berikut?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
Saya memiliki memori yang tidak jelas bahwa deklarasi eksplisit dari for
loop dapat dihindari dan ditulis dalam if
kondisi tersebut. Apakah ini benar?
if any((file_name.endswith(ext) for ext in extensions))
.Jawaban:
Meskipun tidak dikenal secara luas, str.endswith juga menerima tuple. Anda tidak perlu mengulang.
sumber
import string; str.endswith(tuple(string.ascii_lowercase))
endswith
terima tuple hanya untuk python 2.5 ke atasCukup gunakan:
sumber
Ambil ekstensi dari file dan lihat apakah ekstensi itu ada di set ekstensi:
Menggunakan set karena kompleksitas waktu untuk pencarian dalam set adalah O (1) ( docs ).
sumber
.endswith()
dengan tupel diinternir akan lebih cepat dari satu set lookup{'.mp3','.avi'}
ia menghindari konversi tipe tambahan dan mungkin lebih mudah dibaca tergantung pada latar belakang Anda ('Meskipun dapat menyebabkan kebingungan dengan kamus, dan tidak dapat digunakan untuk membuat kosong set).Ada dua cara: ekspresi reguler dan metode string (str).
Metode string biasanya lebih cepat (~ 2x).
792 ns ± 1,83 ns per loop (rata-rata ± std. Dev dari 7 run, masing-masing 10.00000 loop)
274 ns ± 4,22 ns per loop (rata-rata ± std. Dev dari 7 run, masing-masing 10.00000 loop)
sumber
Aku punya ini:
sumber
return filename.endswith(ext)
? : PSaya baru saja menemukan ini, sambil mencari sesuatu yang lain.
Saya akan merekomendasikan untuk pergi dengan metode dalam
os
paket. Ini karena Anda bisa membuatnya lebih umum, mengimbangi kasus aneh apa pun.Anda dapat melakukan sesuatu seperti:
sumber
Kemungkinan lain bisa menggunakan pernyataan IN:
sumber
index
seharusnyarindex
dalam kasus itu.Cara lain yang dapat mengembalikan daftar string yang cocok adalah
sumber