次のコードを書くPythonの方法は何ですか?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
for
ループの明示的な宣言を回避してif
条件に書き込むことができるという漠然とした記憶があります。これは本当ですか?
次のコードを書くPythonの方法は何ですか?
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
for extension in extensions:
if file_name.endswith(extension):
#do stuff
for
ループの明示的な宣言を回避してif
条件に書き込むことができるという漠然とした記憶があります。これは本当ですか?
回答:
広く知られているわけではありませんが、str.endswithはタプルも受け入れます。ループする必要はありません。
>>> 'test.mp3'.endswith(('.mp3', '.avi'))
True
import string; str.endswith(tuple(string.ascii_lowercase))
endswith
python 2.5以降のタプルのみを受け入れます
ファイルから拡張子を取得し、それが拡張子のセットに含まれているかどうかを確認します。
>>> import os
>>> extensions = set(['.mp3','.avi'])
>>> file_name = 'test.mp3'
>>> extension = os.path.splitext(file_name)[1]
>>> extension in extensions
True
セットでのルックアップの時間の複雑さがO(1)(docs)であるため、セットを使用します。
.endswith()
インターンされたタプルを使用すると、セットルックアップよりも高速になります
{'.mp3','.avi'}
。これにより、余分な型変換が回避され、バックグラウンドによっては読みやすくなる場合があります(ただし、辞書との混同が生じる可能性があり、空を作成するために使用することはできませんセット)。
正規表現と文字列(str)メソッドの2つの方法があります。
通常、文字列メソッドの方が高速です(〜2x)。
import re, timeit
p = re.compile('.*(.mp3|.avi)$', re.IGNORECASE)
file_name = 'test.mp3'
print(bool(t.match(file_name))
%timeit bool(t.match(file_name)
ループあたり792 ns±1.83 ns(7回の実行の平均±標準偏差、それぞれ1000000ループ)
file_name = 'test.mp3'
extensions = ('.mp3','.avi')
print(file_name.lower().endswith(extensions))
%timeit file_name.lower().endswith(extensions)
ループあたり274 ns±4.22 ns(7つの実行の平均±標準偏差、それぞれ1000000ループ)
私はこれを持っています:
def has_extension(filename, extension):
ext = "." + extension
if filename.endswith(ext):
return True
else:
return False
return filename.endswith(ext)
?:P
別の可能性は、INステートメントを使用することです。
extensions = ['.mp3','.avi']
file_name = 'test.mp3'
if "." in file_name and file_name[file_name.rindex("."):] in extensions:
print(True)
index
なければなりませんrindex
。
if any((file_name.endswith(ext) for ext in extensions))
。