Python3从字典列表筛选指定字典并提取特定键值的方法
Python字典筛选与字段提取实现方案
需求说明
- 运行环境:Python 3.x
- 待实现功能:从JSON解析得到的字典列表中,筛选出
name字段值为abcd的目标字典,提取该字典内的name、id字段值存入变量,供后续业务逻辑调用。 - 预期筛选得到的目标字典:
{'name': 'abcd', 'id': '41541893-f916-426b-b135-c7500759b0b3', 'created_at': '2022-06-24T08:39:39.806Z'}
现有代码与运行输出
原有代码
output = data.decode("utf-8") input = json.loads(output) for itm in input['items']: print(itm)
提示:
input是Python内置的输入函数名,不建议作为自定义变量名使用,会覆盖内置方法导致后续调用input()时出现异常,下述实现中会替换为input_data规避该问题。
原有代码运行输出
{'name': 'ufg', 'id': '0126ffc8-a1b1-423e-b7fe-56d4e93a80d6', 'created_at': '2022-06-16T04:37:32.958Z'} {'name': 'xyz', 'id': '194ac74b-54ac-45c6-b4d3-c3ae3ebc1d27', 'created_at': '2022-06-26T10:32:50.307Z'} {'name': 'defg', 'id': '3744bdaa-4e74-46f6-bccb-1dc2eca2d2c1', 'created_at': '2022-06-26T10:55:21.273Z'} {'name': 'abcd', 'id': '41541893-f916-426b-b135-c7500759b0b3', 'created_at': '2022-06-24T08:39:39.806Z'}
完整实现代码
直接在原有解析逻辑的基础上增加遍历匹配、字段提取逻辑即可,匹配到目标后直接终止循环,减少不必要的遍历开销:
import json output = data.decode("utf-8") input_data = json.loads(output) # 初始化变量,避免未匹配到时变量不存在抛出异常 target_dict = None target_name = None target_id = None for itm in input_data['items']: if itm.get('name') == 'abcd': target_dict = itm target_name = itm['name'] target_id = itm['id'] break # 找到唯一目标后直接跳出循环 # 以下为结果验证,正式使用可删除 print("筛选得到的目标字典:", target_dict) print("提取的name值:", target_name) print("提取的id值:", target_id)
运行效果
执行代码后输出如下,符合预期:
筛选得到的目标字典: {'name': 'abcd', 'id': '41541893-f916-426b-b135-c7500759b0b3', 'created_at': '2022-06-24T08:39:39.806Z'} 提取的name值: abcd 提取的id值: 41541893-f916-426b-b135-c7500759b0b3
后续逻辑直接调用target_name、target_id变量即可。
补充说明
- 用
itm.get('name')做判断而非直接取itm['name'],是为了避免列表中存在缺失name字段的字典时触发KeyError,如果能确定所有字典都包含name字段,直接写itm['name'] == 'abcd'也可正常运行。 - 如果列表中可能存在多个
name值为abcd的条目,删掉break语句,把匹配到的字典追加到结果列表中存储即可。 - 变量初始化步骤不要省略,否则当列表中不存在匹配项时,后续调用
target_name、target_id会抛出变量未定义的异常。
内容的提问来源于stack exchange,提问作者asp
相关产品推荐
相关产品推荐

