Python中如何对嵌套字典数组高效应用函数?
Python中处理含子字典数组的字典列表的最优方法
一、先解决你的生成器问题
你写的生成器没拿到有效结果,核心原因是process函数没有返回值——Python函数默认返回None,所以生成器迭代出来的都是None。两种修正方式:
1. 让process返回修改后的字典
def process(elem: dict): elem['name'] = 'NAME' return elem # 关键:返回修改后的字典 # 生成器表达式会延迟执行process,迭代时才处理 processed_data_generator = (process(d) for d in elem['sub_array']) # 迭代生成器,触发处理并获取结果 for processed_dict in processed_data_generator: print(processed_dict) # 现在能拿到修改后的字典
2. 利用字典的可变性(不依赖返回值)
因为字典是可变对象,process里的修改会直接作用于原对象。如果不需要在生成器中获取返回值,只是想触发处理逻辑,可以直接迭代生成器(哪怕每个元素是None):
def process(elem: dict): elem['name'] = 'NAME' # 无return processed_data_generator = (process(d) for d in elem['sub_array']) # 迭代生成器才会真正执行process for _ in processed_data_generator: pass # 原elem['sub_array']里的字典已经被修改了 print(elem['sub_array'])
二、避免嵌套循环的技巧
你原来的两层循环可以用itertools.chain扁平化所有子字典数组,把嵌套迭代变成单层迭代:
from itertools import chain # 第一步:把所有字典的sub_array扁平化,得到一个所有子字典的迭代器 all_sub_elements = chain.from_iterable(item['sub_array'] for item in my_array) # 第二步:用你喜欢的方式处理所有子元素 # 生成器(大数据量首选,内存友好) gen = (process(d) for d in all_sub_elements) # map函数(简洁) map_obj = map(process, all_sub_elements) # 列表推导(小数据量用,直观) processed_list = [process(d) for d in all_sub_elements]
三、几种处理方式的对比
| 方式 | 特点 | 适用场景 |
|---|---|---|
| 列表推导 | 代码简洁,一次性生成所有结果(会占用内存存储所有元素) | 数据量小,需要直接拿到所有处理后结果 |
| map函数 | 返回迭代器,延迟执行,内存友好;语法简洁,但对多参数函数支持较弱 | 数据量大,处理逻辑是简单单参数函数调用 |
| 生成器表达式 | 返回迭代器,延迟执行,内存友好;语法灵活,支持复杂逻辑 | 数据量大,处理逻辑复杂或需要自定义迭代逻辑 |
四、注意:避免修改原数据的场景
如果不想修改原字典,需要在process中先拷贝字典再修改:
import copy def process(elem: dict): # 浅拷贝(如果子字典还有嵌套,用copy.deepcopy) new_elem = elem.copy() new_elem['name'] = 'NAME' return new_elem
这样处理后得到的是新字典,原数据不会被改动。
内容的提问来源于stack exchange,提问作者El Pandario
相关产品推荐
相关产品推荐

