Проверьте, заканчивается ли строка одной из строк из списка.

Каков питонический способ написания следующего кода?

extensions = ['.mp3','.avi']
file_name = 'test.mp3'

for extension in extensions:
    if file_name.endswith(extension):
        #do stuff

У меня есть неопределенная память о том, что явное объявление цикла for можно избежать и записать в условии if. Это правда?

Ответ 1

Хотя это и не широко известно, str.endswith также принимает кортеж. Вам не нужно зацикливаться.

>>> 'test.mp3'.endswith(('.mp3', '.avi'))
True

Ответ 2

Просто используйте:

if file_name.endswith(tuple(extensions)):

Ответ 3

Возьмите расширение из файла и посмотрите, находится ли он в наборе расширений:

>>> import os
>>> extensions = set(['.mp3','.avi'])
>>> file_name = 'test.mp3'
>>> extension = os.path.splitext(file_name)[1]
>>> extension in extensions
True

Использование набора, поскольку временная сложность поиска в наборах - это O (1) (docs).

Ответ 4

У меня есть это:

def has_extension(filename, extension):

    ext = "." + extension
    if filename.endswith(ext):
        return True
    else:
        return False