问题的提出
挑战:给出一个Python的字符串列表和一个查询字符串。找到与查询字符串部分匹配的字符串。
例1:
- 输入:
['hello', 'world', 'python']和'pyth' - 输出。
['python']
例 2:
- 输入:
['aaa', 'aa', 'a']和'a' - 输出。
['aaa', 'aa', 'a']
例3:
- 输入:
['aaa', 'aa', 'a']和'b' - 输出。
[]
让我们深入研究解决这个问题和类似问题的几种方法。我们从最直接的解决方案开始。
方法1:成员资格+列表理解
要在一个字符串列表lst 中找到一个部分匹配的字符串列表query ,最Pythonic的方法是使用成员运算符in 和列表理解语句,像这样。[s for s in lst if query in s].
这里有一个简单的例子。
def partial(lst, query):
return [s for s in lst if query in s]
# Example 1:
print(partial(['hello', 'world', 'python'], 'pyth'))
# ['python']
# Example 2:
print(partial(['aaa', 'aa', 'a'], 'a'))
# ['aaa', 'aa', 'a']
# Example 3:
print(partial(['aaa', 'aa', 'a'], 'b'))
# []
方法2:list() 和 filter()
要找到一个部分查询匹配的列表,给定一个字符串列表lst ,将成员操作符与 [filter()](https://blog.finxter.com/python-filter/)函数,在这个函数中,你传递一个lambda函数,对列表中的每个元素进行成员操作的评估,像这样。list(filter(lambda x: query in x, lst)).
这里有一个例子。
def partial(lst, query):
return list(filter(lambda x: query in x, lst))
# Example 1:
print(partial(['hello', 'world', 'python'], 'pyth'))
# ['python']
# Example 2:
print(partial(['aaa', 'aa', 'a'], 'a'))
# ['aaa', 'aa', 'a']
# Example 3:
print(partial(['aaa', 'aa', 'a'], 'b'))
# []
漂亮的Python 单行代码,不是吗?
一般来说,我更喜欢列表理解,而不是filter() 函数,因为前者更简洁(例如,不需要将结果转换为列表),而且速度稍快。但是,这两种方法都能完美地工作!
方法3:Regex Match + List Comprehension
最灵活的方法是通过Python强大的正则表达式功能来找到部分查询匹配的列表lst 。例如,表达式[x for x in lst if re.match(pattern, x)] 可以找到所有与你定义的某个查询模式相匹配的字符串。
下面的例子展示了这种解决方案。
import re
def partial(lst, query):
pattern = '.*' + query + '.*'
return [x for x in lst if re.match(pattern, x)]
# Example 1:
print(partial(['hello', 'world', 'python'], 'pyth'))
# ['python']
# Example 2:
print(partial(['aaa', 'aa', 'a'], 'a'))
# ['aaa', 'aa', 'a']
# Example 3:
print(partial(['aaa', 'aa', 'a'], 'b'))
# []
在这个例子中,我们使用了假模式.*query.* ,它只是匹配包含query 字符串的单词。然而,你也可以做更高级的模式匹配--Rgex来拯救你