¿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 for
bucle puede evitarse y escribirse en la if
condició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))
endswith
acepta 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
os
paquete. 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
index
debería estarrindex
en ese caso.Otra forma de devolver la lista de cadenas coincidentes es
fuente