Каков питонный способ написания следующего кода?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
У меня есть смутное воспоминание, что явного объявления for
цикла можно избежать и записать в if
условии. Это правда?
if any((file_name.endswith(ext) for ext in extensions))
.Ответы:
Хотя str.endswith не очень широко известен, он также принимает кортеж. Вам не нужно зацикливаться.
источник
import string; str.endswith(tuple(string.ascii_lowercase))
endswith
принимает кортеж только для Python 2.5 и вышеПросто используйте:
источник
Возьмите расширение из файла и посмотрите, есть ли оно в наборе расширений:
Использование набора, потому что сложность времени для поиска в наборах составляет O (1) ( документы ).
источник
.endswith()
с интернированным кортежем будет быстрее, чем поиск по множеству{'.mp3','.avi'}
это позволяет избежать дополнительного преобразования типов и может быть более читабельным в зависимости от вашего фона («Хотя это может вызвать путаницу со словарями и не может быть использовано для создания пустых»). наборы).Есть два способа: регулярные выражения и строковые (str) методы.
Строковые методы обычно быстрее (~ 2x).
792 нс ± 1,83 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000000 циклов в каждом)
274 нс ± 4,22 нс на цикл (среднее ± стандартное отклонение 7 циклов, 1000000 циклов в каждом)
источник
У меня есть это:
источник
return filename.endswith(ext)
? : PЯ только сталкивался с этим, ища что-то еще.
Я бы порекомендовал пойти с методами в
os
пакете. Это потому, что вы можете сделать это более общим, компенсируя любой странный случай.Вы можете сделать что-то вроде:
источник
Другой возможностью может быть использование оператора IN:
источник
index
должно бытьrindex
в этом случае.Другой способ, который может вернуть список совпадающих строк:
источник