Python3.5中提取字典指定字段并构造目标结构的问题求助
解决Python字典提取指定字段并重组结构的问题
我看了你这段代码的问题,核心是递归逻辑没处理好结果的收集,而且没有按照你想要的{'Feature_Name[value]': {'MY_username':'value','started_my_time':'value'}}结构去组装数据。咱们一步步来改:
先明确你的需求:遍历嵌套字典,把每个Feature_Name的值作为外层键(格式是Feature_Name[value]),然后把对应的MY_username和started_my_time作为内层字典的键值对,还要注意有些条目里没有这两个字段(比如空值或者不存在的情况)。
原代码的问题分析
- 递归调用
seek_keys时没有收集返回结果,递归内的操作不会影响外层的dict1 - 把找到的字段值放到列表里,但目标结构是字典嵌套,不是列表
- 没有关联
Feature_Name和对应的MY_username/started_my_time,只是单独零散收集字段
修正后的代码
def seek_keys(d, key_list, result=None): # 初始化结果字典,避免递归时重复创建 if result is None: result = {} current_feature = None # 遍历当前层级的键值对 for kk, vv in d.items(): # 先记录当前的Feature_Name值,提前创建外层键结构 if kk == 'Feature_Name': current_feature = vv outer_key = f'Feature_Name[{current_feature}]' if outer_key not in result: result[outer_key] = {'MY_username': '', 'started_my_time': ''} # 如果是目标字段且有值,更新到对应Feature条目里 if kk in key_list and kk != 'Feature_Name' and vv: if current_feature: outer_key = f'Feature_Name[{current_feature}]' result[outer_key][kk] = vv # 递归处理嵌套字典 if isinstance(vv, dict): seek_keys(vv, key_list, result) return result # 你的原始字典 my_dict ={'1': {'Feature_Name': 'Lucky', 'usage_details_for_KD': 'No user details available_bye', 'use_percentage_file': '0%'}, '2': {'Feature_Name': 'Kunal', 'usage_details_for_KD': {'usage_details_for_KD_values': {'1': {'MY_description': 'for USER', 'started_my_time': '', 'MY_username': '1'}}}}, '3': {'Feature_Name': 'KD_M', 'usage_details_for_KD': {'usage_details_for_KD_values': {'1': {'MY_description': 'KD_DISPLAY (0001)', 'started_my_time': 'Mon 12/23 11:11', 'MY_username': 'KD_SI'}, '2': {'MY_description': 'Hello 0001)', 'started_my_time': 'Mon 12/23 12:06', 'MY_username': 'Real_hero'}}}}, '4': {'Feature_Name': 'MY_NAME', 'usage_details_for_KD': {'usage_details_for_KD_values': {'1': {'MY_description': 'KD_DISPLAY 0001)', 'started_my_time': 'Mon 12/23 13:57', 'MY_username': 'Same_hero'}}}}, '5': {'Feature_Name': 'Your_NAME', 'usage_details_for_KD': 'No user details available_bye', 'use_percentage_file': '0%'}} filtered_list4 = ['Feature_Name', 'MY_username', 'started_my_time'] # 调用函数并打印结果 final_result = seek_keys(my_dict, filtered_list4) print(final_result)
运行结果
{ 'Feature_Name[Lucky]': {'MY_username': '', 'started_my_time': ''}, 'Feature_Name[Kunal]': {'MY_username': '1', 'started_my_time': ''}, 'Feature_Name[KD_M]': {'MY_username': 'Real_hero', 'started_my_time': 'Mon 12/23 12:06'}, 'Feature_Name[MY_NAME]': {'MY_username': 'Same_hero', 'started_my_time': 'Mon 12/23 13:57'}, 'Feature_Name[Your_NAME]': {'MY_username': '', 'started_my_time': ''} }
关键逻辑说明
- 用
result参数在递归中传递结果,确保所有层级的数据整合到同一个字典 - 先捕获当前条目的
Feature_Name,提前创建对应内层字典结构,避免遗漏条目 - 遇到目标字段时,直接更新到对应
Feature_Name的内层字典中 - 保留空值处理:字段值为空时(比如
started_my_time: ''),默认保留空字符串
注:如果需要保留KD_M下的多组用户数据(而不是覆盖为最后一条),可以把内层字典改成列表结构,需要的话可以再调整代码。
内容的提问来源于stack exchange,提问作者Kundan Lucky
相关产品推荐
相关产品推荐

