我正在寻找最有效 的方法来将单个字符串的结尾与预定义字符串列表中的值进行匹配。 例如
my_str='QWERTY' my_lst=['QWE','QQQQ','TYE','YTR','TY'] match='TY'`或者`match=['TY']
在限制之下
len(my_lst)`是已知但任意的因此可能很长,大概 在 中的 30 个元素`my_lst`可能有所不同所以 我`len`不能`my_str`每次都只检查定义的最后部分以及 中的匹配元素它们可以是字符串或列表,以更高效者为准(参见背景)大多很小,不超过 8 个字符函数不会这样做因为我需要匹配只在最后发生。它本身没有用因为它只会匹配 应该始终是唯一的或者因为 中没有元素会彼此共享结尾 `my_str``my_lst` `len(my_str)` `in` `endswith``return``Boolean` `[]``my_lst
一些背景知识可以略过 我开始将这个问题作为一个列表问题,例如['Q','W','E','R','T','Y'],我将有一个包含 1 个字符的字符串列表用于匹配,并且我考虑对[::-1]每个候选者进行反向迭代检查。 然后我意识到可以连接内部列表,因为它们只包含字符串,并对结果字符串运行相同的逻辑。
['Q','W','E','R','T','Y']
[::-1]
match=filter(lambda x: my_str.endswith(x), my_lst) match=[x for x in my_lst if my_str.endswith(x)]
我成功了,但我想知道是否有一些内置或最佳的方法来查找并返回匹配的结束值。
在 Python 中,有几种有效的方法可以检查一个字符串是否以列表中的任意字符串结尾。你已经使用了 filter 和列表推导式的方法,实际上这两种方法都很简洁且易于理解。接下来,我将介绍一些更高效的实现方式,以及解释为什么某些方法可能更适合你的需求。
filter
endswith
如果你已经知道 my_lst 中的所有可能匹配项,你可以使用 str.endswith() 方法,配合元组参数来一次性检查多个后缀。这种方式比单独调用 endswith 更高效,因为它只遍历一次 my_lst。
my_lst
str.endswith()
my_str = 'QWERTY' my_lst = ['QWE', 'QQQQ', 'TYE', 'YTR', 'TY'] # 使用 endswith 方法 matches = [suffix for suffix in my_lst if my_str.endswith(suffix)] print(matches) # 输出匹配的后缀
如果你想要更快地查找并且你的后缀是固定的,你可以考虑将 my_lst 转换为集合,这样你可以在后缀匹配时实现 O(1) 的查找时间。然后,你可以使用 endswith 来查找匹配项。
my_str = 'QWERTY' my_lst = ['QWE', 'QQQQ', 'TYE', 'YTR', 'TY'] # 将 my_lst 转换为集合 suffix_set = set(my_lst) # 找到所有匹配的后缀 matches = [suffix for suffix in suffix_set if my_str.endswith(suffix)] print(matches) # 输出匹配的后缀
虽然正则表达式可能不如 endswith 方法高效,但它可以在某些情况下提供更大的灵活性。如果你需要进行更复杂的匹配(例如,检查多个字符组合),你可以使用正则表达式。
import re my_str = 'QWERTY' my_lst = ['QWE', 'QQQQ', 'TYE', 'YTR', 'TY'] # 创建正则表达式 pattern = '|'.join(map(re.escape, my_lst)) + r'\Z' # 使用 \Z 确保匹配字符串的结尾 matches = re.findall(pattern, my_str) print(matches) # 输出匹配的后缀
endswith()
你可以根据你的具体需求选择最适合的方法。如果你知道列表元素数量较少,直接使用 endswith 方法会是一个很好的选择。