尝试创建嵌套字典时出现 KeyError

KeyError when attempting to create a nested dictionary

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

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

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

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

当 Python 的解释器尝试 运行 这一行时,您会得到 KeyError 异常:

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

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

此外,Python 中的 append 方法没有 return 任何东西,因此 group_dict[group] 将等于 None

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

的每一行
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