问题语句::该方法接收一个元组列表。每个元组包含两个项目,一个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
答案 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