【问题标题】:TypeError: unhashable type: 'list' - creating frequency functionTypeError: unhashable type: 'list' - 创建频率函数
【发布时间】:2017-04-25 08:21:35
【问题描述】:

我将一个文本文件作为输入并创建一个函数来计算最常出现的单词。如果 2 个或更多单词出现频率最高且相等,我将打印所有这些单词。

def wordOccurance(userFile):

    userFile.seek(0)
    line = userFile.readline()
    lines = []
    while line != "":
        if line != "\n":
            line = line.lower() # making lower case
            line = line.rstrip("\n") # cleaning
            line = line.rstrip("?") #cleans the whole docoument by removing "?" 
            line = line.rstrip("!") #cleans the whole docoument by removing "!"
            line = line.rstrip(".") #cleans the whole docoument by removing "."
            line = line.split(" ") #splits the texts into space
            lines.append(line)
        line = userFile.readline() # keep reading lines from document.

    words = lines

    wordDict = {} #creates the clean word Dic, from above 
    for word in words: #
        if word in wordDict.keys():
            wordDict[word] = wordDict[word] + 1
        else:
           wordDict[word] = 1

    largest_value = max(wordDict.values())

    for k in wordDict.keys():
        if wordDict[k] == largest_value:
            print(k)

    return wordDict

请帮我完成这个功能。

【问题讨论】:

  • 哪一行会引发错误?在某些时候(可能在wordDict[word] = 1),您正在尝试将列表用作字典键,这是不允许的。
  • 这一行给了我错误信息:if word in wordDict.keys():
  • 我想不出有什么方法可以让你从那行得到那个错误。我发布的解决方案对您有用吗?如果没有,您能否在您的问题中发布您的错误的完整回溯,以便我可以更好地帮助您?
  • 您的解决方案有效,但我不明白。这是我在大学的第一门编程课程,我之前从未见过那行代码来了解它是如何工作的。除此之外非常感谢你
  • 知道了。请参阅我更新的答案以获取对该行的解释,以及嵌套循环的简化解决方案。

标签: list function python-3.x dictionary methods


【解决方案1】:

在这一行中,您正在创建一个字符串列表:

line = line.split(" ") #splits the texts into space

然后你将它附加到一个列表中,这样你就有了一个列表列表:

lines.append(line)

稍后您遍历该列表列表,并尝试使用子列表作为键:

for word in words: #
    if word in wordDict.keys():
        wordDict[word] = wordDict[word] + 1
    else:
       wordDict[word] = 1  # Here you will try to assign a list (`word`) as a key, which is not allowed

一个简单的解决方法是首先展平列表列表:

words = [item for sublist in lines for item in sublist]

for word in words: #
    if word in wordDict.keys():
        wordDict[word] = wordDict[word] + 1
    else:
       wordDict[word] = 1

list comprehension[item for sublist in lines for item in sublist] 将遍历lines,然后遍历line.split(" ") 创建的子列表,并返回一个由每个子列表中的项目组成的新列表。对你来说,lines 可能看起来像这样:

[['words', 'on', 'line', 'one'], ['words', 'on', 'line', 'two']]

列表推导会变成这样:

['words', 'on', 'line', 'one', 'words', 'on', 'line', 'two']

如果你想使用一些不太复杂的东西,你可以使用嵌套循环:

    # words = lines
    # just use `lines` in your for loop instead of creating an identical list 

    wordDict = {} #creates the clean word Dic, from above 
    for line in lines:
        for word in line:
            if word in wordDict.keys():
                wordDict[word] = wordDict[word] + 1
            else:
                wordDict[word] = 1

    largest_value = max(wordDict.values())

这可能会有点低效率和/或“Pythonic”,但它可能会更容易让你绕开。

此外,您可能需要考虑在清理数据之前将每行拆分为单词,因为如果先清理行,则只会删除行尾而不是单词末尾的标点符号。但是,根据您数据的性质,这可能不是必需的。

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 2019-10-11
    • 2020-03-27
    • 2020-05-11
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多