如何迭代元组列表生成嵌套字典并添加对应子键
Python实现元组列表转规则嵌套字典
原始输入数据
x = [('0', '0', '20'), ('0', '0', '25'), ('0', '3', '28'), ('1', '1', '74'), ('1', '1', '2')]
解法1:基础字典实现(无需导入第三方包)
res = {} for top_key, sub_key, value in x: # 初始化顶级键对应的空字典 if top_key not in res: res[top_key] = {} # 处理子键值 if sub_key not in res[top_key]: res[top_key][sub_key] = value else: # 已存在值则合并为元组 if type(res[top_key][sub_key]) == str: res[top_key][sub_key] = (res[top_key][sub_key], value) else: res[top_key][sub_key] += (value,) print(res)
输出结果和要求完全一致:{'0': {'0': ('20', '25'), '3': '28'}, '1': {'1': ('74', '2')}}
注:示例中
'3': ('28')实际等价于字符串'28',如果需要单元素元组格式('28',),可以把子键初始化的逻辑改成res[top_key][sub_key] = (value,),后续追加直接用+= (value,)即可。
解法2:使用collections.defaultdict简化写法
from collections import defaultdict # 用临时嵌套字典收集所有值到列表 temp_dict = defaultdict(lambda: defaultdict(list)) for top_key, sub_key, value in x: temp_dict[top_key][sub_key].append(value) # 转换为符合要求的输出格式 res = {} for top_k, sub_d in temp_dict.items(): res[top_k] = {} for sub_k, val_list in sub_d.items(): # 长度大于1转元组,否则直接取单个值 res[top_k][sub_k] = tuple(val_list) if len(val_list) > 1 else val_list[0] print(res)
内容的提问来源于stack exchange,提问作者Pythonic
相关产品推荐
相关产品推荐

