Defaultdict() 是正确的选择吗?

Defaultdict() the correct choice?

编辑:错误已修复

想法是从文件中读取文本,清理它,然后配对 连续 个单词(不是排列):

file = f.read()
words = [word.strip(string.punctuation).lower() for word in file.split()]
pairs = [(words[i]+" " + words[i+1]).split() for i in range(len(words)-1)]

然后,对于每一对,创建一个列表,其中包含整个文本中可以跟在该对之后的所有可能的 单个 单词。该字典看起来像

[ConsecWordPair]:[listOfFollowers]

因此,引用给定对的字典将 return 该对之后的所有单词。例如

wordsThatFollow[('she', 'was')]
>> ['alone', 'happy', 'not']

我实现这个的算法涉及 defaultdict(list)...

wordsThatFollow = defaultdict(list) 

for i in range(len(words)-1):
    try:
        # pairs overlap, want second word of next pair
        # wordsThatFollow[tuple(pairs[i])] = pairs[i+1][1]
        EDIT: wordsThatFollow[tuple(pairs[i])].update(pairs[i+1][1][0]
    except Exception:
        pass

我不太担心我必须用 'try-except' 规避的值错误(除非我应该是)。问题是算法 只成功 return 一个追随者 :

wordsThatFollow[('she', 'was')]
>> ['not']

抱歉,如果这 post 对社区不利,我正在解决问题 ^^

你的问题是当你真的想扩展时,你总是覆盖值:

# Instead of this
wordsThatFollow[tuple(pairs[i])] = pairs[i+1][1]

# Do this
wordsThatFollow[tuple(pairs[i])].append(pairs[i+1][1])