Python 与子字符串相交

Python intersection with substrings

我有两套:

a = set(['this', 'is', 'an', 'apple!'])
b = set(['apple', 'orange'])

我想查找 (a) 中是否有任何 (b) 包括子字符串。 通常我会这样做:

c = a.intersection(b)

但是,在这个例子中,它会 return 一个空集 'apple' != 'apple!'

假设我无法从 (a) 中删除字符并且希望不创建循环,我有没有办法找到匹配项?

编辑:我希望它 return 来自 (b) 的匹配项,例如我想知道 'apple' 是否在集合 (a) 中,我不想 return 'apple!'

最好的做法是:

any(x in y for x in b for y in a)

这是一个循环,但你无法逃脱它。任何解决方案至少都会在某处有一个隐含的循环。

您可以使用 in 进行子字符串匹配,而不是通过 == 进行相等性检查,这也涵盖了相等性:

>>> [x for ele in a for x in b if x in ele]
["apple"]

如果您不搜索完全匹配,使用集合实际上没有什么好处,如果单词总是以相同的子字符串开头,排序和平分将是一种更有效的方法,即 O(n log n) vs O(n^2):

a = set(['this', 'is', 'an', 'apple!'])
b = set(['apple', 'orange'])

srt = sorted(a)
from bisect import bisect

inter = [word for word in b if srt[bisect(srt, word, hi=len(a))].startswith(word)]