You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何避免更新同一列表与字典时的代码重复?

如何避免更新列表和字典的重复代码?

方案1:提取独立的辅助处理函数

把重复的「结果判断+更新集合」逻辑抽成单独的函数,让原my_func专注于计算ret_1和ret_2,符合单一职责原则,代码解耦性更好:

def update_collections(ret_1, ret_2, target_list, target_dict, key):
    if ret_1 is not None and ret_2 is not None:
        target_list.append(ret_1)
        target_dict[key] = ret_2

# 原代码修改为:
final_list = []
final_dict = {}

for iter_1 in iterables_1:
    if condition_1:
        ret_1, ret_2 = my_func(...)
        update_collections(ret_1, ret_2, final_list, final_dict, iter_1)
    elif condition_2:
        for iter_2 in iterables_1:
            for iter_3 in iterables_3:
                ret_1, ret_2 = my_func(...)
                update_collections(ret_1, ret_2, final_list, final_dict, iter_1)

方案2:将更新逻辑整合进my_func(你的思路)

这种做法可行,但要权衡场景:

  • 如果my_func的唯一用途就是为了更新final_list和final_dict,这么做没问题,能减少调用处的代码量;
  • 但如果之后需要单独调用my_func获取计算结果而不更新集合,这种耦合会导致代码冗余或需要重构。

另外,Python中列表和字典是可变对象,函数内部修改它们不需要返回(返回是多余的),可以简化代码:

def my_func(target_list, target_dict, key, ...):
    # 计算 ret_1, ret_2
    if ret_1 is not None and ret_2 is not None:
        target_list.append(ret_1)
        target_dict[key] = ret_2

# 调用时不需要接收返回值
final_list = []
final_dict = {}

for iter_1 in iterables_1:
    if condition_1:
        my_func(final_list, final_dict, iter_1, ...)
    elif condition_2:
        for iter_2 in iterables_1:
            for iter_3 in iterables_3:
                my_func(final_list, final_dict, iter_1, ...)

方案3:先收集所有有效结果,再批量更新

如果遍历逻辑不依赖实时更新的集合,可以先把所有符合条件的(ret_1, ret_2, key)收集起来,最后一次性更新列表和字典,完全消除重复代码:

final_list = []
final_dict = {}
valid_results = []

for iter_1 in iterables_1:
    if condition_1:
        ret_1, ret_2 = my_func(...)
        if ret_1 is not None and ret_2 is not None:
            valid_results.append( (ret_1, ret_2, iter_1) )
    elif condition_2:
        for iter_2 in iterables_1:
            for iter_3 in iterables_3:
                ret_1, ret_2 = my_func(...)
                if ret_1 is not None and ret_2 is not None:
                    valid_results.append( (ret_1, ret_2, iter_1) )

# 批量更新
for ret1, ret2, key in valid_results:
    final_list.append(ret1)
    final_dict[key] = ret2

总结

优先推荐方案1,它既消除了重复代码,又保持了函数职责的清晰;如果场景特殊(比如my_func永远只服务于这两个集合),方案2也可以用;方案3适合不需要实时更新集合的场景,代码可读性也不错。

内容的提问来源于stack exchange,提问作者Carlo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:05:27