【发布时间】:2019-12-18 04:35:39
【问题描述】:
我已经设置(不是列表)字符串(单词)。这是一个很大的。 (使用 openCV 和 tesseract 从图像中提取出来,因此没有可靠的方法来预测其内容。)
在使用此列表时,我需要确定它是否包含至少一个以我当前正在处理的部分开头的单词。 所以它就像(不是实际代码):
if exists(word.startswith(word_part) in word_set) then continue else break
关于如何在列表中查找所有以here开头的字符串有一个很好的答案:
result = [s for s in string_list if s.startswith(lookup)]
或
result = filter(lambda s: s.startswith(lookup), string_list)
但它们返回找到的所有字符串中的list 或iterator。
我只需要查找集合中是否存在任何这样的字符串,而不是全部获取。
就性能而言,获取列表似乎有点愚蠢,然后获取其 len 并查看它是否大于零,然后删除该列表。
有更好/更快/更清洁的方法吗?
【问题讨论】:
-
你可以只是
re.search("[\b]lookup_term",original_block_of_text))...但它仍然是O(N)......你可以制作一组word[:len(lookup_term)]而不是整个单词......但仍然需要O (N) 构建该集合(但随后非常快速查找)... -
如果你想短路,为什么不
if any(word.startswith(word_part) for word in wordset)? -
如果你想让这个检查更高效,你应该把你的字符串存储在前缀树中(见这个问题stackoverflow.com/questions/11015320/…或使用真正的库),否则就像其他人一样使用
any已经提到了。 -
sort+bisect+startswith。 -
Joran Beasely,不,那不行,我需要多次这样做。具有不同的-length 起始字母集。所以建立一个不同的列表来查找性能太重了。克里斯,是的,这正是我所需要的,我刚开始用 python 编码,所以我还不知道“任何”,谢谢! Boris,对于像我这样的前 Web 开发人员来说,这太数据科学了。还不是我的水平,谢谢指点。等我有更多经验时,我会朝这个方向看。
标签: python python-3.x any