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

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}')

代码说明

  1. 提取州列表:list(data.keys())直接获取原数据中的州名,Python3.7及以上版本的字典会保留插入顺序,完美满足“州的顺序固定”的要求。
  2. defaultdict初始化:通过lambda: {state: None for state in states},让每个新出现的Name自动生成包含所有州、值为None的字典,省去手动判断初始化的步骤。
  3. 填充数据:遍历每个州下的人员数据,直接覆盖对应Name-州位置的None为实际QTY值。
  4. 转换为普通字典:如果不需要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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:15:31