如何将处理句子列表的重复Python代码封装为可获取index的函数
解决方案
方案1:使用回调函数传递额外逻辑
把需要用到index的额外逻辑封装为回调函数,作为可选参数传入公共处理函数,在匹配到关键词的位置触发回调,把当前index、已生成的keyword_dict等所需变量都传递到回调中使用。
封装后的公共函数
def process_sentences(sentences, complete_keyword_list, after_match_callback=None): keyword_dict = dict() for index, sentence in enumerate(sentences): keyword_set_inside_dict = set() for each_keyword in complete_keyword_list: if each_keyword in sentence: keyword_set_inside_dict.add(each_keyword) keyword_dict[sentence] = keyword_set_inside_dict # 传入回调则执行额外逻辑 if after_match_callback: after_match_callback(index, keyword_dict) return keyword_dict
调用示例
audio_nested_dictionary = dict() if not audio_keyword_dictionary: # 无额外逻辑直接调用 keyword_dict = process_sentences(sentences, complete_keyword_list) for key, value in keyword_dict.items(): print(f'{value} - {key}\n') else: # 定义需要用到index的额外逻辑 def handle_match(index, current_keyword_dict): # 新增index>0判断避免取到列表末尾元素 if index > 0: for each_value in audio_keyword_dictionary.values(): if each_value in sentences[index - 1] and sentences[index - 1] != '': audio_nested_dictionary[each_value] = current_keyword_dict # 传入回调调用 process_sentences(sentences, complete_keyword_list, after_match_callback=handle_match) # 打印结果 for k, v in audio_nested_dictionary.items(): for key, value in v.items(): print(f'{k} - {value} {key}\n')
方案2:使用生成器返回中间状态
把公共处理函数改成生成器,每次匹配到关键词就抛出当前的index和中间状态,在外层调用时接收这些值处理额外逻辑,无需传入回调。
封装后的生成器函数
def iterate_sentences(sentences, complete_keyword_list): keyword_dict = dict() for index, sentence in enumerate(sentences): keyword_set_inside_dict = set() for each_keyword in complete_keyword_list: if each_keyword in sentence: keyword_set_inside_dict.add(each_keyword) keyword_dict[sentence] = keyword_set_inside_dict # 抛出当前迭代的中间状态 yield index, keyword_dict # 迭代结束抛出最终的keyword_dict yield None, keyword_dict
调用示例
if not audio_keyword_dictionary: # 取最后抛出的最终keyword_dict即可 *_, (_, keyword_dict) = iterate_sentences(sentences, complete_keyword_list) for key, value in keyword_dict.items(): print(f'{value} - {key}\n') else: audio_nested_dictionary = dict() for index, current_keyword_dict in iterate_sentences(sentences, complete_keyword_list): if index is None: break if index > 0: for each_value in audio_keyword_dictionary.values(): if each_value in sentences[index - 1] and sentences[index - 1] != '': audio_nested_dictionary[each_value] = current_keyword_dict # 打印结果 for k, v in audio_nested_dictionary.items(): for key, value in v.items(): print(f'{k} - {value} {key}\n')
注意事项
- 原代码未判断index是否为0,
index-1会取到列表末尾元素,建议新增index > 0的判断避免逻辑错误 - 原自行封装的函数依赖全局变量
complete_keyword_list,修改后改为通过参数传递,降低代码耦合
内容的提问来源于stack exchange,提问作者Laila Campos
相关产品推荐
相关产品推荐

