Qual é a maneira pitônica de escrever o seguinte código?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
Tenho uma vaga memória de que a declaração explícita do for
loop pode ser evitada e escrita na if
condição. Isso é verdade?
if any((file_name.endswith(ext) for ext in extensions))
.Respostas:
Embora não seja amplamente conhecido, o str.endswith também aceita uma tupla. Você não precisa fazer um loop.
fonte
import string; str.endswith(tuple(string.ascii_lowercase))
endswith
aceita tupla somente para python 2.5 e superior #Apenas use:
fonte
Pegue uma extensão do arquivo e veja se está no conjunto de extensões:
Usar um conjunto porque a complexidade do tempo para pesquisas em conjuntos é O (1) ( docs ).
fonte
.endswith()
com um tuple internado será mais rápido do que uma pesquisa set{'.mp3','.avi'}
evita a conversão extra de tipos e pode ser mais legível, dependendo do seu plano de fundo ('Embora possa causar confusão com dicionários e não possa ser usado para criar vazio]. conjuntos).Há duas maneiras: expressões regulares e métodos string (str).
Os métodos de string geralmente são mais rápidos (~ 2x).
792 ns ± 1,83 ns por loop (média ± desvio padrão de 7 corridas, 1000000 loops cada)
274 ns ± 4,22 ns por loop (média ± desvio padrão de 7 corridas, 1000000 loops cada)
fonte
Eu tenho isto:
fonte
return filename.endswith(ext)
? : PAcabei de descobrir isso, enquanto procurava por outra coisa.
Eu recomendaria ir com os métodos no
os
pacote. Isso ocorre porque você pode torná-lo mais geral, compensando qualquer caso estranho.Você pode fazer algo como:
fonte
Outra possibilidade poderia ser usar a instrução IN:
fonte
index
deve estarrindex
nesse caso.Outra maneira que pode retornar a lista de strings correspondentes é
fonte