【问题标题】:KeyError when attempting to create a nested dictionary尝试创建嵌套字典时出现 KeyError
【发布时间】:2019-09-10 15:40:55
【问题描述】:

问题陈述:该方法接收一个元组列表。每个元组由两个项目组成,一个 ID 和一个字符串。实例变量search_criteria 是一个字典。键是组名,值是要在每个元组中查找的关键字列表,如果找到则返回 ID。

输入示例:
结果 - (id, text-field)
search_criteria -(组名,要搜索的关键字)

results = [(1, "This is an example"), (2, "Another example"), (3, "Random String)] search_criteria = {"HR" : ["example", "harrassment", "fired"], "Maintenance" : ["is", "Random", "Cleaning"]}

示例输出

{
    "HR" : {"example": [1,2]}, 
    "Maintenance" : { "is" : [1], "Random" : [3]}
}

如果找到一个词,将组映射到关键字,将关键字映射到找到的 id 列表。

def build_keywords_found_dict(self, results):
    group_dict = {}

    for group in self.search_criteria:
        for keyword in self.search_criteria[group]:
            keyword_dict = {}
            for data in results:
                if keyword in data[1]:
                    group_dict[group] = keyword_dict[keyword].append(data[0])

    return group_dict

当前输出:

KeyError

【问题讨论】:

    标签: python python-3.x dictionary keyerror


    【解决方案1】:

    您可以创建一个反向映射字典,将单词映射到它们的标准,这样您就可以遍历每个短语中的单词并在线性时间内将单词映射到它们的标准:

    mapping = {i: k for k, l in search_criteria.items() for i in l}
    output = {}
    for id, words in results:
        for word in words.split():
            if word in mapping:
                output.setdefault(mapping[word], {}).setdefault(word, []).append(id)
    

    output 变为:

    {'Maintenance': {'is': [1], 'Random': [3]}, 'HR': {'example': [1, 2]}}
    

    【讨论】:

      【解决方案2】:

      keyword_dict 始终是一个空的dict。你永远不会添加任何东西。您可能需要考虑使用defaultdict

      【讨论】:

        【解决方案3】:

        当 Python 的解释器尝试运行此行时,您会收到 KeyError 异常:

        group_dict[group] = keyword_dict[keyword].append(data[0])

        每当您尝试访问字典中不存在的键时,都会引发此异常。在您的示例中,keyword_dict 中不存在keyword,并且keyword_dict[keyword] 无效(keyword_dict 始终为空)。

        此外,Python 中的append 方法不返回任何内容,因此group_dict[group] 将等于None

        您的问题的确切预期输出没有明确定义(如果没有关键字出现在元组中会发生什么?),但这里有一个可选的解决方案,无需过多更改您的代码。我添加了一条评论,解释了我更改/添加的每一行:

        def build_keywords_found_dict(results):
            # Create an empty dict for each word in search_criteria
            group_dict = {word: {} for word in self.search_criteria} 
        
            for group in self.search_criteria:
                for keyword in self.search_criteria[group]:
                    keyword_dict = {}
                    for data in results:
                        if keyword in data[1]:
                            # If the keyword doesn't exist in keyword_dict, add it with an empty list
                            keyword_dict.setdefault(keyword, [])
                            # Append the ID of the keyword to the list
                            keyword_dict[keyword].append(data[0])
        
                    # If keyword_dict isn't empty, add it to group_dict
                    if keyword_dict:
                        group_dict[group][keyword] = keyword_dict[keyword]
        
            return group_dict
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          • 2020-06-27
          • 2023-01-14
          • 1970-01-01
          • 2017-12-14
          • 1970-01-01
          相关资源
          最近更新 更多