如何在Python列表中找到一个部分字符串?

452 阅读2分钟

问题的提出

💬 挑战:给出一个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来拯救你