检查字符串是否以列表中的字符串之一结尾

问题描述 投票:0回答:7

以下代码的 Python 风格是什么?

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

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

我有一个模糊的记忆,

for
循环的显式声明可以避免并写在
if
条件中。这是真的吗?

python string list
7个回答
647
投票

虽然不广为人知,但str.endswith也接受元组。你不需要循环。

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

65
投票

只需使用:

if file_name.endswith(tuple(extensions)):

9
投票

返回匹配字符串列表的另一种方法是

sample = "alexis has the control"
matched_strings = filter(sample.endswith, ["trol", "ol", "troll"])
print matched_strings
['trol', 'ol']

7
投票

有两种方式:正则表达式和字符串(str)方法。

字符串方法通常更快(约 2 倍)。

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 次循环)


2
投票

我在寻找其他东西时刚刚发现了这个。

我建议使用

os
包中的方法。这是因为您可以使其更加通用,以补偿任何奇怪的情况。

你可以这样做:

import os

the_file = 'aaaa/bbbb/ccc.ddd'

extensions_list = ['ddd', 'eee', 'fff']

if os.path.splitext(the_file)[-1] in extensions_list:
    # Do your thing.

1
投票

我有这个:

def has_extension(filename, extension):

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

0
投票

另一种可能性是使用 IN 语句:

extensions = ['.mp3','.avi']
file_name  = 'test.mp3'
if "." in file_name and file_name[file_name.rindex("."):] in extensions:
    print(True)
© www.soinside.com 2019 - 2024. All rights reserved.