如何优化重复的函数输出检查及字典填充硬编码逻辑?
优化重复的遍历-函数调用-字典存储逻辑
问题描述
我存在重复的代码块逻辑:遍历输入列表,调用函数获取列表类型的返回值,若返回的列表非空,则将其存入对应字典。示例代码如下:
def some_func(i): """ 满足条件返回非空列表,否则返回空列表 """ return ['abc', 'def'] if i % 2 == 0 else [] i_inputs = [4, 2, 3, 6, 3, 8, 2] y1 = {} for i in i_inputs: _x = some_func(i) if _x: y1[i] = _x
目前代码中有多组此类逻辑,每组对应不同的输入列表、目标字典以及调用函数,示例如下:
i_inputs = [4, 2, 3, 6, 3, 8, 2] y1 = {} for i in i_inputs: _x = some_func(i) if _x: y1[i] = _x i_inputs2 = [8, 2, 4, 8, 9, 1] y2 = {} for i in i_inputs2: _x = some_func2(i) if _x: y2[i] = _x i_inputs3 = [4, 8, 2, 9, 9, 1, 5] y3 = {} for i in i_inputs3: _x = some_func3(i) if _x: y3[i] = _x
请问除了硬编码所有输入列表和目标字典的方式外,是否有更优的实现方案?
优化方案
1. 封装通用处理函数
把重复的循环、判断逻辑抽成一个通用函数,传入输入列表和对应的处理函数,直接返回生成的字典:
def process_inputs(input_list, func): result = {} for item in input_list: res = func(item) if res: result[item] = res return result # 调用示例 y1 = process_inputs(i_inputs, some_func) y2 = process_inputs(i_inputs2, some_func2) y3 = process_inputs(i_inputs3, some_func3)
每组逻辑只需一行调用代码,彻底消除重复代码块。
2. 用字典推导式简化(单行实现)
如果追求更简洁的写法,可以用字典推导式替代循环:
y1 = {i: some_func(i) for i in i_inputs if some_func(i)}
注意:如果some_func执行成本较高,这种写法会调用两次函数。可以用生成器表达式先预计算结果,避免重复调用:
y1 = {i: res for i, res in ((i, some_func(i)) for i in i_inputs) if res}
3. 批量处理多组任务
如果要处理的组数很多,可将所有任务参数(输入列表、处理函数)整理成集合,批量生成结果:
# 定义所有任务:(输入列表, 处理函数) tasks = [ (i_inputs, some_func), (i_inputs2, some_func2), (i_inputs3, some_func3) ] # 批量生成结果,用列表存储所有字典 results = [process_inputs(inp, func) for inp, func in tasks] # 若需要对应命名的变量,可用字典映射 named_results = { "y1": process_inputs(i_inputs, some_func), "y2": process_inputs(i_inputs2, some_func2), "y3": process_inputs(i_inputs3, some_func3) }
后续新增任务只需在tasks中添加一行即可,大幅降低维护成本。
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

