判断字符串是否以列表中某个变长前缀开头

24 投票
11 回答
45416 浏览
提问于 2025-04-17 03:00

我想知道一个名字是否以某个列表中的前缀开头,然后把这个前缀去掉,比如:

if name[:2] in ["i_", "c_", "m_", "l_", "d_", "t_", "e_", "b_"]:
    name = name[2:]

上面的代码只适用于长度为两个的前缀。我需要对长度不固定的前缀实现相同的功能。

怎么才能高效地做到这一点(代码少,性能好)呢?

用一个循环遍历每个前缀,然后检查 name.startswith(prefix),最后根据前缀的长度来切割名字,这样是可以的,但代码量太大,可能效率不高,而且不太符合Python的风格。

有没有人有好的解决方案呢?

11 个回答

5

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续运行。

比如说,你可能希望在用户输入一个数字后,程序才开始计算。这个时候,我们就需要用到“条件语句”。条件语句就像是一个检查点,程序会在这里停下来,看看条件是否成立。如果成立,程序就会继续执行;如果不成立,程序可能会选择做其他事情,或者直接停止。

简单来说,条件语句帮助我们控制程序的流程,让它更智能地响应不同的情况。

for prefix in prefixes:
    if name.startswith(prefix):
        name=name[len(prefix):]
        break
49

str.startswith(prefix[, start[, end]])¶

这个函数用来检查一个字符串是不是以某个开头(前缀)开始的。如果是,就返回True(真),如果不是,就返回False(假)。这个前缀可以是一个字符串,也可以是多个字符串组成的元组。你还可以选择从字符串的某个位置开始检查(这个位置就是start),并且可以选择在字符串的某个位置结束检查(这个位置就是end)。

$ ipython
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: prefixes = ("i_", "c_", "m_", "l_", "d_", "t_", "e_", "b_")

In [2]: 'test'.startswith(prefixes)
Out[2]: False

In [3]: 'i_'.startswith(prefixes)
Out[3]: True

In [4]: 'd_a'.startswith(prefixes)
Out[4]: True
15

这段代码可能有点难懂,但它是可以工作的:

name=name[len(filter(name.startswith,prefixes+[''])[0]):]

撰写回答