Python 3.8下将单键字典列表合并为单字典的优雅单行方案
适配Python 3.8的单键字典列表合并方案
你原来手写list(x.keys())[0]、list(x.values())[0]的写法,本质是绕开了字典原生的键值对迭代能力,既产生了不必要的临时列表构造开销,代码逻辑也显得生硬。
最优原生单行实现(无额外依赖、性能最优)
完全基于Python原生语法,兼容3.8环境,适配大量字典的批量合并场景:
mylist = [{'a':1}, {'b':2}, {'c':3}] mydict = dict(pair for subdict in mylist for pair in subdict.items())
最终生成的字典和你预期的结果完全一致:
{'a': 1, 'b': 2, 'c': 3}
方案优势
- 代码逻辑更顺畅:遍历列表内的每个子字典,提取所有子字典里的键值对,直接传给原生支持键值对迭代构造的
dict()方法生成合并结果,读起来没有绕弯的生硬感 - 性能表现更好:处理大量字典元素时,没有临时列表的构造开销,迭代过程基于字典内置的
items()视图完成,内存占用、运行效率都远优于你原来的实现 - 容错性更强:如果后续业务中子字典临时增加了额外的键值对(不破坏“所有键全局唯一”的前提),代码不需要修改就能正常运行,不会因为硬取首元素就遗漏数据
不推荐的单行备选方案
部分写法虽然也能实现单行合并,但因为不满足大量元素批量处理的性能要求,不建议使用:
- 基于
reduce的字典解包写法:每次迭代都会重新构造一个全新的字典,时间复杂度随列表长度线性上升,处理上千个字典时会有明显的性能损耗
# 仅作语法展示,不推荐大量数据场景使用 from functools import reduce mydict = reduce(lambda old, new: {**old, **new}, mylist)
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

