Jaki jest pythoniczny sposób pisania następującego kodu?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
Mam niejasną pamięć, że for
można uniknąć jednoznacznej deklaracji pętli i zapisać ją pod if
warunkiem. Czy to prawda?
if any((file_name.endswith(ext) for ext in extensions))
.Odpowiedzi:
Chociaż nie jest to powszechnie znane, str.endswith akceptuje również krotkę. Nie musisz zapętlać.
źródło
import string; str.endswith(tuple(string.ascii_lowercase))
endswith
akceptuje krotkę tylko dla Pythona 2.5 i nowszychPo prostu użyj:
źródło
Weź rozszerzenie z pliku i sprawdź, czy znajduje się w zestawie rozszerzeń:
Używanie zestawu, ponieważ złożoność czasowa wyszukiwania w zestawach wynosi O (1) ( docs ).
źródło
.endswith()
z krotką internowaną będzie szybsza niż wyszukiwanie zestawu{'.mp3','.avi'}
pozwala to uniknąć dodatkowej konwersji typów i może być bardziej czytelna w zależności od tła („Może to powodować zamieszanie w słownikach i nie może być używane do tworzenia pustych zestawy).Istnieją dwa sposoby: wyrażenia regularne i metody string (str).
Metody łańcuchowe są zwykle szybsze (~ 2x).
792 ns ± 1,83 ns na pętlę (średnia ± odchylenie standardowe z 7 przebiegów, każdy 1000000 pętli)
274 ns ± 4,22 ns na pętlę (średnia ± odchylenie standardowe z 7 przebiegów, każda 1000000 pętli)
źródło
Mam to:
źródło
return filename.endswith(ext)
? : PWłaśnie się z tym spotkałem, szukając czegoś innego.
Poleciłbym skorzystać z metod zawartych w
os
pakiecie. Dzieje się tak, ponieważ możesz uczynić to bardziej ogólnym, kompensując każdy dziwny przypadek.Możesz zrobić coś takiego:
źródło
Inną możliwością może być użycie instrukcji IN:
źródło
index
powinien byćrindex
w takim przypadku.innym sposobem na zwrócenie listy pasujących ciągów jest
źródło