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)]
我有两套:
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)]