如何精简重复Python代码,实现DataFrame列值到嵌套变量有序映射
冗余逐列赋值的重构实现方案
核心思路
你现有实现的核心问题是把列位置和分层键的固定对应关系和赋值操作逻辑耦合在了一起——既要逐行写字典路径,又要手动维护列号的递增计数器。重构时只需要把已知的对应关系抽成独立的配置表,配合通用的嵌套赋值逻辑循环执行即可,不需要逐行写重复代码。
具体实现步骤
- 第一步:提前把DataFrame列位置和分层键的对应关系,按已知顺序整理成列表。这部分可以完全复用你原来50行赋值代码里的键路径顺序,不需要调整原有对应关系,比如:
# 列表顺序和df从第0列到第49列的顺序严格一一对应 COLUMN_KEY_MAPPING = [ ("AA", "A", "a"), # 对应第0列 ("AA", "A", "b"), # 对应第1列 # ... 中间剩余46组键路径,完全按照你原来写的赋值顺序补全即可 ("AA", "B", "a"), # 对应倒数第二列 ("AA", "B", "b"), # 对应最后一列(第49列) ]
- 第二步:写通用的嵌套字典赋值工具方法,避免硬编码多层字典定位逻辑:
def set_nested_dict_value(target_dict, key_path, value): current_layer = target_dict # 逐层定位到倒数第二层的字典结构 for key in key_path[:-1]: # 如果当前层键不存在则自动初始化空字典,避免KeyError current_layer = current_layer.setdefault(key, {}) # 给最内层键赋值 current_layer[key_path[-1]] = value
- 第三步:替换原来的50行重复赋值逻辑,用循环批量完成映射:
# 取出df_row第0行对应所有列的值,不需要逐次调用iloc取数 row_values = df_row.iloc[0, :len(COLUMN_KEY_MAPPING)].tolist() # 批量遍历完成赋值,完全替代原来逐行写的重复代码 for key_path, cell_value in zip(COLUMN_KEY_MAPPING, row_values): set_nested_dict_value(blocks[i].myvar, key_path, cell_value)
即使你提前已经完成了
myvar的全路径嵌套字典初始化,这个工具方法依然可以正常工作,不会对原有字典结构产生额外影响。
方案优势
- 彻底移除手动维护的
iloc计数器,不会出现漏写递增、数错位置导致的赋值错位问题 - 配置和逻辑完全解耦,后续需要调整列位置和键的对应关系时,只需要修改配置列表的顺序即可,不需要在满屏的赋值代码里逐行调整
- 完全不受DataFrame列名干扰,因为是按照固定位置匹配,哪怕列名是无意义的乱值也能正常工作
- 后续如果需要用元组形式的分层键(比如
("AA", "B", "a"))快速取值,可以补一个通用的查询方法,不需要逐层写嵌套索引:
def get_nested_dict_value(target_dict, key_path): current_layer = target_dict for key in key_path: current_layer = current_layer[key] return current_layer # 调用示例,和逐层取嵌套值的结果完全一致 my_value = get_nested_dict_value(blocks[i].myvar, ("AA", "B", "a"))
内容的提问来源于stack exchange,提问作者Raf
相关产品推荐
相关产品推荐

