这是我目前的代码:
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
答案 0 :(得分:1)
当您将新的counter
插入d
时,先检查word
是否包含在words
中。您可能想检查word
中是否已包含d
:
if word not in d:
d[word] = [counter]
else:
d[word].append(counter)
检查word
或words
中是否包含line
应该是一个单独的if
。
您还可以使用dicts setdefault()
方法简化此逻辑:
d.setdefault(word, []).append(counter)
或者您d
成为defaultdict
,这进一步简化了作业:
from collections import defaultdict
d = defaultdict(list)
...
d[word].append(counter)
关于一般算法注意,当你首先遍历所有行以递增计数器然后,当计数器已经达到它的最大值时,开始检查拼写错误的单词。可能你应该检查循环中增加计数器的每一行。
答案 1 :(得分: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
将是一个字典,其中包含无法识别的单词作为键,以及单词作为匹配值条目的行号。