我正在尝试对一组匹配器和一组字符串进行排序,如果我有
matchers = ['foo', 'bar', 'abc']
和
strings = ['afooa', 'zbarz', 'abcabc', 'purple', 'foobar']
我希望能够获取strings其中任何元素都是子字符串的元素matchers,例如
strings
matchers
results = ['afooa', 'zbarz', 'abcabc', 'foobar'],理想情况下不需要仅仅依靠嵌套的 for 循环。
results = ['afooa', 'zbarz', 'abcabc', 'foobar']
我已经查看了一段时间,但是这个问题很难用可搜索的术语来表达,因此,任何人在搜索方面提供的任何建议都将不胜感激。
你可以使用 Python 中的列表解析或 filter 函数配合 any 来实现这个目标,而不需要明确地编写嵌套的 for 循环。
filter
any
matchers = ['foo', 'bar', 'abc'] strings = ['afooa', 'zbarz', 'abcabc', 'purple', 'foobar'] # 使用列表解析和 any results = [s for s in strings if any(m in s for m in matchers)] print(results)
['afooa', 'zbarz', 'abcabc', 'foobar']
any()
any(m in s for m in matchers)
s
results = list(filter(lambda s: any(m in s for m in matchers), strings)) print(results)
lambda
True
如果 matchers 很大,可以将它转化为正则表达式进行匹配,进一步提高性能:
import re # 构建正则表达式模式 pattern = re.compile('|'.join(map(re.escape, matchers))) # 筛选匹配的字符串 results = [s for s in strings if pattern.search(s)] print(results)
re.compile
foo|bar|abc
re.escape
pattern.search(s)
这三种方法都可以实现你的需求,根据数据规模选择适合你的实现方式即可!