¿Cuál es la forma pitónica de escribir el siguiente código?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
Tengo un vago recuerdo de que la declaración explícita del forbucle puede evitarse y escribirse en la ifcondición. ¿Es esto cierto?

if any((file_name.endswith(ext) for ext in extensions)).Respuestas:
Aunque no es ampliamente conocido, str.endswith también acepta una tupla. No necesitas hacer un bucle.
fuente
import string; str.endswith(tuple(string.ascii_lowercase))endswithacepta tupla solo para python 2.5 y superiorSolo usa:
fuente
Tome una extensión del archivo y vea si está en el conjunto de extensiones:
Usar un conjunto porque la complejidad temporal para las búsquedas en conjuntos es O (1) ( docs ).
fuente
.endswith()con una tupla interna será más rápido que una búsqueda establecida{'.mp3','.avi'}puede usar la sintaxis matemática para conjuntos, evita la conversión de tipo adicional y puede ser más legible dependiendo de su fondo ('Aunque puede causar confusión con los diccionarios y no puede usarse para crear vacíos conjuntos).Hay dos formas: expresiones regulares y métodos de cadena (str).
Los métodos de cadena suelen ser más rápidos (~ 2x).
792 ns ± 1.83 ns por bucle (media ± desviación estándar de 7 corridas, 1000000 bucles cada una)
274 ns ± 4.22 ns por bucle (media ± desviación estándar de 7 corridas, 1000000 bucles cada una)
fuente
Tengo esto:
fuente
return filename.endswith(ext)? : PAcabo de encontrar esto, mientras buscaba algo más.
Recomendaría ir con los métodos en el
ospaquete. Esto se debe a que puede hacerlo más general, compensando cualquier caso extraño.Puedes hacer algo como:
fuente
Otra posibilidad podría ser hacer uso de la declaración IN:
fuente
indexdebería estarrindexen ese caso.Otra forma de devolver la lista de cadenas coincidentes es
fuente