Defaultdict()正确的选择?

时间:2016-01-13 02:13:28

标签: defaultdict

编辑:错误修正

我们的想法是从文件中读取文本,清理文本,然后配对连续的单词(不是permations):

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)]

然后,对于每对,创建一个列表,列出在整个文本中可以跟随该对的所有可能的单个单词。 dict看起来像

[ConsecWordPair]:[listOfFollowers]

因此,引用给定对的字典将返回可以跟随该对的所有单词。 E.g。

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

我并不担心我必须避免的价值错误“尝试 - 除了' (除非我应该)。问题是算法只能成功返回其中一个关注者

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

很抱歉,如果这篇文章对社区不利,我会在我去的时候搞清楚事情^^

1 个答案:

答案 0 :(得分:1)

您的问题是,当您真的要扩展时,您总是会覆盖该值:

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

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