如何过滤Python字典列表并提取指定键的嵌套值?
提取字典列表中指定键的嵌套值并格式化输出
需求说明
给定如下Python字典列表:
resp = [ { 'meter_id': {'S': 'M#G000140'}, 'meter_reading_reader': {'S': 'Meyer'}, 'meter_reading_date': {'S': '2021-12-21T12:00:00'}, 'item_type': {'S': 'READING'}, 'meter_reading_value': {'S': '225'}, 'meter_reading_unit': {'S': 'cbm'}, 'meter_kind': {'S': 'Gas'}, 'month': {'S': 'December'}, 'year': {'S': '2021'}, 'SK': {'S': 'MPID#P-00002-01-MG-001'}, 'building_id': {'S': 'B#BUI-00001'}, 'PK': {'S': 'READ#G000140#2021#Dec'}, 'meter_serial_number': {'S': '7GMT0008942175'} }, { 'meter_id': {'S': 'M#G000155'}, 'meter_reading_reader': {'S': 'Meyer'}, 'meter_reading_date': {'S': '2022-02-28T12:00:00'}, 'item_type': {'S': 'READING'}, 'meter_reading_value': {'S': '45'}, 'meter_reading_unit': {'S': 'cbm'}, 'meter_kind': {'S': 'Gas'}, 'month': {'S': 'February'}, 'year': {'S': '2022'}, 'SK': {'S': 'MPID#P-00002-01-MG-001'}, 'building_id': {'S': 'B#BUI-00001'}, 'PK': {'S': 'READ#G000155#2022#Feb'}, 'meter_serial_number': {'S': '7GMT0008942175'} } ]
需要过滤该列表,仅保留meter_reading_date和meter_reading_value两个键值对,且值为原嵌套字典中'S'对应的内容,最终输出格式如下:
{ 'meter_reading_date': '2021-12-21T12:00:00', 'meter_reading_value': '225' }, { 'meter_reading_date': '2022-02-28T12:00:00', 'meter_reading_value': '45' },
解决方案
方法一:循环构建新字典
遍历原列表,逐个提取目标键的嵌套值,构建新字典并加入结果列表:
# 初始化结果列表 result = [] for item in resp: # 提取指定键的'S'值,构建目标字典 filtered_item = { 'meter_reading_date': item['meter_reading_date']['S'], 'meter_reading_value': item['meter_reading_value']['S'] } result.append(filtered_item) # 按期望格式打印结果 for item in result: print("{") print(f" 'meter_reading_date': '{item['meter_reading_date']}',") print(f" 'meter_reading_value': '{item['meter_reading_value']}'") print("},")
方法二:列表推导式(更简洁)
用列表推导式一行生成结果列表,再格式化输出:
# 用列表推导式生成目标列表 result = [ { 'meter_reading_date': item['meter_reading_date']['S'], 'meter_reading_value': item['meter_reading_value']['S'] } for item in resp ] # 格式化打印,最后一个元素不加逗号 for idx, item in enumerate(result): print("{") print(f" 'meter_reading_date': '{item['meter_reading_date']}',") print(f" 'meter_reading_value': '{item['meter_reading_value']}'") print("}" + ("," if idx != len(result)-1 else ""))
方法三:容错处理(避免KeyError)
如果原字典可能缺失目标键或嵌套的'S'键,可添加判断避免报错:
result = [] for item in resp: filtered_item = {} # 检查键是否存在后再提取 if 'meter_reading_date' in item and 'S' in item['meter_reading_date']: filtered_item['meter_reading_date'] = item['meter_reading_date']['S'] if 'meter_reading_value' in item and 'S' in item['meter_reading_value']: filtered_item['meter_reading_value'] = item['meter_reading_value']['S'] result.append(filtered_item) # 打印结果 for item in result: print(item)
内容的提问来源于stack exchange,提问作者aerioeus
相关产品推荐
相关产品推荐

