Python嵌套值转置:为缺失值填充None的通用实现方案
解决方案:嵌套字典按Name转置并补全所有州的QTY值(缺失填充None)
核心思路
要实现通用的转置效果,关键步骤是:
- 先提取所有州的列表(保持原数据中的顺序)
- 为每个Name预先创建包含所有州的字典,默认值设为
None - 遍历原数据,将存在的QTY值填充到对应位置
实现代码(使用collections.defaultdict)
from collections import defaultdict data = { "New York": [ { "Name": "John", "QTY": 56 }, { "Name": "Richard", "QTY": 76 } ], "Texas": [ { "Name": "John", "QTY": 34 }, { "Name": "Stephanie", "QTY": 23 } ], "Florida": [ { "Name": "Rebecca", "QTY": 28 }, { "Name": "Richard", "QTY": 43 } ], "Arizona": [ {"Name": "Charles", "QTY": 23}, {"Name": "Anne", "QTY": 31}, {"Name": "William", "QTY": 44} ], "New Mexico": [ {"Name": "Rebecca", "QTY": 56}, {"Name": "Charles", "QTY": 76}, {"Name": "Stephen", "QTY": 21}, {"Name": "William", "QTY": 63} ], "New Jersey": [ {"Name": "John", "QTY": 56}, {"Name": "Richard", "QTY": 76}, {"Name": "Stephen", "QTY": 45} ] } # 提取所有州的列表,保持原顺序(Python3.7+字典默认有序) states = list(data.keys()) # 使用defaultdict,每个Name对应一个预先初始化好所有州为None的字典 output = defaultdict(lambda: {state: None for state in states}) # 遍历原数据填充QTY值 for state, people in data.items(): for person in people: name = person["Name"] output[name][state] = person["QTY"] # 转换为普通字典(可选,根据需求决定是否保留defaultdict类型) output = dict(output) # 打印结果 for name, state_qty in output.items(): print(f'"{name}": {state_qty}')
代码说明
- 提取州列表:
list(data.keys())直接获取原数据中的州名,Python3.7及以上版本的字典会保留插入顺序,完美满足“州的顺序固定”的要求。 - defaultdict初始化:通过
lambda: {state: None for state in states},让每个新出现的Name自动生成包含所有州、值为None的字典,省去手动判断初始化的步骤。 - 填充数据:遍历每个州下的人员数据,直接覆盖对应Name-州位置的
None为实际QTY值。 - 转换为普通字典:如果不需要defaultdict的自动初始化特性,可以最后转为普通字典,结构和示例输出完全一致。
非defaultdict版本(兼容更多场景)
如果不想引入collections模块,也可以用普通字典实现:
states = list(data.keys()) output = {} for state, people in data.items(): for person in people: name = person["Name"] # 如果Name不存在,先初始化所有州为None的字典 if name not in output: output[name] = {s: None for s in states} output[name][state] = person["QTY"]
这个版本逻辑和defaultdict版本一致,只是手动处理了Name的初始化步骤,同样能实现需求。
内容的提问来源于stack exchange,提问作者Ozzie Ghani
相关产品推荐
相关产品推荐

