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

时间:2019-09-10 15:40:55

标签: python python-3.x dictionary keyerror

问题语句::该方法接收一个元组列表。每个元组包含两个项目,一个ID和一个字符串。实例变量search_criteria是字典。关键字是组名,值是在每个元组中查找并返回ID(如果找到)的关键字列表。

示例输入:
结果-(id,文本字段)
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

3 个答案:

答案 0 :(得分: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]}}

答案 1 :(得分:0)

keyword_dict始终为空的dict。您永远不会在其中添加任何内容。您可能要考虑使用defaultdict

答案 2 :(得分:0)

当Python的解释器尝试运行此行时,您将获得KeyError异常:

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

每当您尝试访问字典中不存在的键时,都会引发此异常。在您的示例中,keyword中不存在keyword_dict,并且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