Quelle est la manière pythonique d'écrire le code suivant?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
J'ai un vague souvenir que la déclaration explicite de la for
boucle peut être évitée et être écrite dans la if
condition. Est-ce vrai?
if any((file_name.endswith(ext) for ext in extensions))
.Réponses:
Bien que peu connu, str.endswith accepte également un tuple. Vous n'avez pas besoin de boucler.
la source
import string; str.endswith(tuple(string.ascii_lowercase))
endswith
accepte le tuple uniquement pour python 2.5 et supérieurUtilisez simplement:
la source
Prenez une extension dans le fichier et voyez si elle se trouve dans l'ensemble d'extensions:
Utilisation d'un ensemble car la complexité temporelle des recherches dans les ensembles est O (1) ( docs ).
la source
.endswith()
avec un tuple interne sera plus rapide qu'une recherche d'ensemble{'.mp3','.avi'}
utiliser la syntaxe mathématique pour les ensembles, cela évite la conversion de type supplémentaire et peut être plus lisible en fonction de votre arrière-plan ('Bien que cela puisse causer de la confusion avec les dictionnaires et ne puisse pas être utilisé pour créer des espaces vides) ensembles).Il existe deux façons: les expressions régulières et les méthodes de chaîne (str).
Les méthodes de chaîne sont généralement plus rapides (~ 2x).
792 ns ± 1,83 ns par boucle (moyenne ± écart standard de 7 pistes, 1000000 boucles chacune)
274 ns ± 4,22 ns par boucle (moyenne ± écart standard de 7 passages, 1000000 boucles chacun)
la source
J'ai ceci:
la source
return filename.endswith(ext)
? : PJe viens de tomber sur cela, tout en cherchant autre chose.
Je recommanderais d'aller avec les méthodes dans le
os
paquet. C'est parce que vous pouvez le rendre plus général, en compensant tout cas étrange.Vous pouvez faire quelque chose comme:
la source
Une autre possibilité pourrait être d'utiliser la déclaration IN:
la source
index
devrait êtrerindex
dans ce cas.une autre façon qui peut renvoyer la liste des chaînes correspondantes est
la source