如何重组嵌套dict:交换内外键并将值转为列表的列表
问题需求
需要将给定的嵌套字典交换内外层键:原外层的元组键作为新结构的内层键,原内层的字母键作为新结构的外层键;同时每个新内层键对应的值是原该外层键下所有值组成的列表的列表。
原字典:
import numpy as np a = { (0.0, 0.0): {'a': [25, 29, np.nan]}, (0.0, 2.0): {'a': [25, 29, np.nan], 'b': [25, 35, 31.0]}, (0.0, 4.0): {'b': [25, 35, 31.0]}, (2.0, 0.0): {'a': [25, 29, np.nan], 'c': [25, 26, 29.0]}, (2.0, 1.5): {'a': [25, 29, np.nan], 'c': [25, 26, 29.0]}, (2.0, 2.0): {'a': [25, 29, np.nan], 'b': [25, 35, 31.0]}, (2.0, 4.0): {'b': [25, 35, 31.0]}, (3.0, 3.0): {'d': [25, 31, 32.0]}, (3.0, 5.0): {'d': [25, 31, 32.0]}, (5.0, 0.0): {'c': [25, 26, 29.0]}, (5.0, 1.5): {'c': [25, 26, 29.0]}, (5.0, 3.0): {'d': [25, 31, 32.0]}, (5.0, 5.0): {'d': [25, 31, 32.0]}, (6.0, 1.0): {'e': [25, 28, 30.0]}, (6.0, 3.0): {'e': [25, 28, 30.0]}, (8.0, 1.0): {'e': [25, 28, 30.0]}, (8.0, 3.0): {'e': [25, 28, 30.0]} }
期望结果:
{ 'a': {(0.0, 0.0): [[25, 29, np.nan]], (0.0, 2.0): [[25, 29, np.nan], [25, 35, 31.0]], (2.0, 0.0): [[25, 29, np.nan], [25, 26, 29.0]], (2.0, 1.5): [[25, 29, np.nan], [25, 26, 29.0]], (2.0, 2.0): [[25, 29, np.nan], [25, 35, 31.0]]}, 'b': {(0.0, 2.0): [[25, 29, np.nan], [25, 35, 31.0]], (0.0, 4.0): [[25, 35, 31.0]], (2.0, 2.0): [[25, 29, np.nan], [25, 35, 31.0]], (2.0, 4.0): [[25, 35, 31.0]]}, 'c': {(2.0, 0.0): [[25, 29, np.nan], [25, 26, 29.0]], (2.0, 1.5): [[25, 29, np.nan], [25, 26, 29.0]], (5.0, 0.0): [[25, 26, 29.0]], (5.0, 1.5): [[25, 26, 29.0]]}, 'd': {(3.0, 3.0): [[25, 31, 32.0]], (3.0, 5.0): [[25, 31, 32.0]], (5.0, 3.0): [[25, 31, 32.0]], (5.0, 5.0): [[25, 31, 32.0]]}, 'e': {(6.0, 1.0): [[25, 28, 30.0]], (6.0, 3.0): [[25, 28, 30.0]], (8.0, 1.0): [[25, 28, 30.0]], (8.0, 3.0): [[25, 28, 30.0]]} }
解法一:原生Python实现
使用collections.defaultdict简化嵌套结构的构建,遍历原字典收集对应数据:
from collections import defaultdict import numpy as np result = defaultdict(lambda: defaultdict(list)) for outer_key, inner_dict in a.items(): # 收集当前外层键下的所有值,组成列表的列表 values_list = [v for v in inner_dict.values()] # 遍历每个内层键,关联外层键和对应值列表 for inner_key in inner_dict.keys(): result[inner_key][outer_key] = values_list # 转换为普通字典(可选) result = {k: dict(v) for k, v in result.items()}
解法二:Pandas实现
通过DataFrame转置、堆叠、分组操作实现:
import pandas as pd import numpy as np # 原字典转为DataFrame,外层键为列,内层键为行 df = pd.DataFrame(a) # 转置后,外层键变为行索引,内层键变为列 df = df.T # 堆叠数据得到多层索引Series stacked = df.stack() result = {} for inner_key, group in stacked.groupby(level=1): inner_result = {} # 遍历当前内层键对应的所有唯一外层键 for outer_key in group.index.get_level_values(0).unique(): # 获取当前外层键下的非空值,组成列表的列表 inner_result[outer_key] = list(df.loc[outer_key].dropna().values) result[inner_key] = inner_result
内容的提问来源于stack exchange,提问作者arkriger
相关产品推荐
相关产品推荐

