使用字典将拼写错误的单词分配到行号
这是我现在的代码:
from collections import defaultdict
goodwords = set()
with open("soccer.txt", "rt") as f:
for word in f.readlines():
goodwords.add(word.strip())
badwords = defaultdict(list)
with open("soccer.txt", "rt") as f:
for line_no, line in enumerate(f):
for word in line.split():
if word not in text:
badwords[word].append(line_no)
print(badwords)
我该如何修改我的代码,让它打印出存储在 words
列表中的错误单词以及它们所在的行号呢?
比如,如果单词 togeher
在第5行和第7行拼写错误,它应该打印出类似这样的内容:
togeher 5 7
2 个回答
0
根据你正在做的事情,我觉得下面这个方法非常适合你:
from collections import defaultdict
text = ( "cat", "dog", "rat", "bat", "rat", "dog",
"man", "woman", "child", "child") #
d = defaultdict(list)
for lineno, word in enumerate(text):
d[word].append(lineno)
print d
这个方法的输出结果是:
defaultdict(<type 'list'>, {'bat': [3], 'woman': [7], 'dog': [1, 5],
'cat': [0], 'rat': [2, 4], 'child': [8, 9],
'man': [6]})
这个代码简单地创建了一个空的默认字典,每个你访问的项目都有一个列表,这样你就不用担心要先创建这个条目,然后它会遍历单词列表,所以你也不需要记住行号。
因为你没有正确拼写的单词列表,所以这个方法实际上并不会检查单词是否拼写正确,只是建立了一个包含文本文件中所有单词的字典。
如果你想把字典转换成单词集合,可以试试:
all_words = set(d.keys())
print all_words
这样会产生:
set(['bat', 'woman', 'dog', 'cat', 'rat', 'child', 'man'])
或者,如果你只是想打印出这些单词,可以用:
for word in d.keys():
print word
编辑 3:
我觉得这可能是最终版本: 这是一个(故意设计得)非常简单,但几乎完整的拼写检查器。
from collections import defaultdict
# Build a set of all the words we know, assuming they're one word per line
good_words = set() # Use a set, as this will have the fastest look-up time.
with open("words.txt", "rt") as f:
for word in f.readlines():
good_words.add(word.strip())
bad_words = defaultdict(list)
with open("text_to_check.txt", "rt") as f:
# For every line of text, get the line number, and the text.
for line_no, line in enumerate(f):
# Split into seperate words - note there is an issue with punctuation,
# case sensitivitey, etc..
for word in line.split():
# If the word is not recognised, record the line where it occurred.
if word not in good_words:
bad_words[word].append(line_no)
最后,bad_words
将会是一个字典,里面的键是未识别的单词,而值则是这些单词所在的行号。
1
当你把新的 counter
插入到 d
里时,你首先检查 word
是否在 words
里面。其实你可能是想检查 word
是否已经在 d
里:
if word not in d:
d[word] = [counter]
else:
d[word].append(counter)
检查 word
是否在 words
或 line
里,应该单独用一个 if
来做。
你也可以用字典的 setdefault()
方法来简化这个逻辑:
d.setdefault(word, []).append(counter)
或者你可以把 d
变成一个 defaultdict
,这样赋值会更简单:
from collections import defaultdict
d = defaultdict(list)
...
d[word].append(counter)
关于这个算法的一般说明,现在你是先遍历所有行来增加计数器,然后在计数器达到最大值后,才开始检查拼写错误。其实你应该在增加计数器的循环里,顺便检查每一行。