【问题标题】:what's a simple way to search a very long text file for a word in python?在 python 中搜索一个很长的文本文件以查找单词的简单方法是什么?
【发布时间】:2011-08-17 18:51:14
【问题描述】:

我想使用一个包含大约 80000 个常用单词的按字母顺序排列的文本文件来创建一个非常简单的拼写检查器。

什么是使用python搜索文件并找出它是否包含单词的简单但有效的方法?

我应该将单词列表文件解析成集合、列表、字典、元组吗?

有没有一种简单的方法可以利用我的单词列表已经按字母顺序排列的事实?

我宁愿保持相对简单。我不想要更正的拼写建议或其他花哨的功能。我只是想知道这个词是否拼写错误。

【问题讨论】:

  • 取决于您要查找的字数。

标签: python list search performance spell-checking


【解决方案1】:

由于 80000 个单词很容易被记忆,你最好使用set

words = set(line.strip() for line in open("words"))

这不会利用您的文件已经排序的事实,但无论如何它是最有效的方式。要查找单词w,您可以使用

w in words

摊销 O(1)。

【讨论】:

  • 使用with open("words") as f:,依靠refcounting关闭文件是最后2.4 ;)
  • ...在一般情况下。在最坏的情况下,它是 O(n)。 @delnan 如果您只需要一次文件,他的方法很干净。
  • @Rafe:这是吹毛求疵(不反对吹毛求疵,但应该这样标记)- 你需要一些 真的 运气不好才能得到这么多的碰撞;出于所有实际目的,可以假设 O(1)。和重新。文件:无论您需要文件多长时间,最好手动关闭文件(即通过上下文管理器)。特别是例如PyPy,直到下一次 GC 运行才能关闭文件,越来越适合生产。
  • @delnan 这很有趣。我想我最好多了解一下 PyPy,我可能很快就会开始使用它。
  • 顺便说一句,这适用于 all 不使用引用计数的实现,以支持更复杂(和性能更好)的 GC,这几乎是除 CPython 之外的每一个 -例如,Jython 和 IronPython 从它们的主机 VM 继承此类 GC。当然,原因是此类 GC 不会实时跟踪可达性,而只会偶尔搜索一次垃圾。
【解决方案2】:

将您的 dict 单词放在具有恒定查找时间的集合中。

myDict = set([<actual list of words here>])
for word in file:
    if word not in myDict:
        handleBadWord(word)

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2013-07-05
    • 2011-08-16
    • 1970-01-01
    • 2021-10-31
    • 2022-01-24
    相关资源
    最近更新 更多