如何从含重复值的三个Python列表构建合并型嵌套字典列表
问题
我尝试从三个Python列表构建嵌套字典列表,其中List_A包含重复值,需求是将每个外层键对应的所有内层键值对合并在一起。
我编写了如下代码:
A = ['sibsp', 'sibsp', 'pclass', 'pclass', 'pclass', 'age', 'age', 'age', 'age', 'age', 'age', 'fare', 'fare', 'fare', 'fare', 'fare', 'parch', 'parch'] B = ['(-0.001, 1.0]', '(1.0, 8.0]', '1', '2', '3', '(0.419, 19.0]', '(19.0, 25.0]', '(25.0, 31.8]', '(31.8, 41.0]', '(41.0, 80.0]', 'nan', '(-0.001, 7.854]', '(10.5, 21.679]', '(21.679, 39.688]', '(39.688, 512.329]', '(7.854, 10.5]', '(-0.001, 1.0]', '(1.0, 6.0]'] C = [-0.043281487422643504, 0.5199640685633579, -1.0039159555090957, -0.3644848445981264, 0.6664826567146916, -0.4000843004236305, 0.24183838283179523, -0.04150528802138758, -0.2219732761660194, 0.04505675173309271, 0.4037823142739484, 0.8047930720327325, -0.16862729546072658, -0.25014415313271576, -1.0575407967677335, 0.9062269696875864, 0.04021888607232296, -0.32565170564086077] # 注:原代码中List_A应为A,此处修正笔误 listOfNestedDicts = [{i:{j:k}} for (i,j,k) in zip(A, B, C)]
得到的输出是一个嵌套字典列表,但不符合需求。由于sibsp、pclass、age、fare和parch是DataFrame中的唯一列,我需要将内层B的键映射到对应的C值,而当前输出中每个外层键对应多个独立字典。
我期望得到的输出如下:
[{'sibsp': {'(-0.001, 1.0]': -0.043281487422643504,'(1.0, 8.0]': 0.5199640685633579}}, {'pclass': {'1': -1.0039159555090957 ,'2': -0.3644848445981264, '3': 0.6664826567146916}}, {'age': {'(0.419, 19.0]': -0.4000843004236305,'(19.0, 25.0]': 0.24183838283179523,'(25.0, 31.8]': -0.04150528802138758,'(31.8, 41.0]': -0.2219732761660194,'(41.0, 80.0]': 0.04505675173309271,'nan': 0.4037823142739484}}, {'fare': {'(-0.001, 7.854]': 0.8047930720327325,'(10.5, 21.679]': -0.16862729546072658, '(21.679, 39.688]': -0.25014415313271576,'(39.688, 512.329]': -1.0575407967677335,'(7.854, 10.5]': 0.9062269696875864}}, {'parch': {'(-0.001, 1.0]': 0.04021888607232296,'(1.0, 6.0]': -0.32565170564086077}}]
解决方案
核心思路是先合并相同外层键的内层键值对,再转换为目标列表格式,以下是两种实现方式:
方式一:普通循环实现
A = ['sibsp', 'sibsp', 'pclass', 'pclass', 'pclass', 'age', 'age', 'age', 'age', 'age', 'age', 'fare', 'fare', 'fare', 'fare', 'fare', 'parch', 'parch'] B = ['(-0.001, 1.0]', '(1.0, 8.0]', '1', '2', '3', '(0.419, 19.0]', '(19.0, 25.0]', '(25.0, 31.8]', '(31.8, 41.0]', '(41.0, 80.0]', 'nan', '(-0.001, 7.854]', '(10.5, 21.679]', '(21.679, 39.688]', '(39.688, 512.329]', '(7.854, 10.5]', '(-0.001, 1.0]', '(1.0, 6.0]'] C = [-0.043281487422643504, 0.5199640685633579, -1.0039159555090957, -0.3644848445981264, 0.6664826567146916, -0.4000843004236305, 0.24183838283179523, -0.04150528802138758, -0.2219732761660194, 0.04505675173309271, 0.4037823142739484, 0.8047930720327325, -0.16862729546072658, -0.25014415313271576, -1.0575407967677335, 0.9062269696875864, 0.04021888607232296, -0.32565170564086077] # 构建中间字典,统一存储相同外层键的内层键值对 temp_dict = {} for key, sub_key, value in zip(A, B, C): if key not in temp_dict: temp_dict[key] = {} temp_dict[key][sub_key] = value # 转换为目标格式的列表 result = [{k: v} for k, v in temp_dict.items()] print(result)
方式二:使用collections.defaultdict简化代码
from collections import defaultdict A = ['sibsp', 'sibsp', 'pclass', 'pclass', 'pclass', 'age', 'age', 'age', 'age', 'age', 'age', 'fare', 'fare', 'fare', 'fare', 'fare', 'parch', 'parch'] B = ['(-0.001, 1.0]', '(1.0, 8.0]', '1', '2', '3', '(0.419, 19.0]', '(19.0, 25.0]', '(25.0, 31.8]', '(31.8, 41.0]', '(41.0, 80.0]', 'nan', '(-0.001, 7.854]', '(10.5, 21.679]', '(21.679, 39.688]', '(39.688, 512.329]', '(7.854, 10.5]', '(-0.001, 1.0]', '(1.0, 6.0]'] C = [-0.043281487422643504, 0.5199640685633579, -1.0039159555090957, -0.3644848445981264, 0.6664826567146916, -0.4000843004236305, 0.24183838283179523, -0.04150528802138758, -0.2219732761660194, 0.04505675173309271, 0.4037823142739484, 0.8047930720327325, -0.16862729546072658, -0.25014415313271576, -1.0575407967677335, 0.9062269696875864, 0.04021888607232296, -0.32565170564086077] # defaultdict自动为不存在的键创建空字典 temp_dict = defaultdict(dict) for key, sub_key, value in zip(A, B, C): temp_dict[key][sub_key] = value # 转换为目标列表 result = [{k: v} for k, v in temp_dict.items()] print(result)
两种方式均可生成符合需求的嵌套字典列表,先通过中间字典合并同键数据,再将每个键值对包装为单个字典存入列表。
内容的提问来源于stack exchange,提问作者thothbk
相关产品推荐
相关产品推荐

