Python中如何根据JSON对象已知同级键值查找对应另一同级属性
你提到的循环遍历思路是可行的基础实现,根据查询场景的不同,有更清晰、更适配业务需求的规范写法,按需选择即可。
首先先修正你示例代码里的两个问题:
Robin对应的字典条目末尾缺失逗号,会触发语法错误- 不建议用
object作为变量名,它是Python的内置基类,直接做变量名容易引发隐性冲突,修正后的测试结构如下:
participant_data = { "participants": [ {"name": "Tyler", "role": "CEO"}, {"name": "Robin", "role": "analyst"}, {"name": "James", "role": "manager"} ] }
方案1:单次/低频查询:直接遍历(无额外开销)
如果只需要做一两次查询,不需要反复根据姓名查角色,不需要额外构建中间数据结构,直接遍历匹配即可,时间复杂度O(n),单次查询开销极低:
def get_role(target_name: str, data: dict = participant_data) -> str | None: for person in data["participants"]: if person["name"] == target_name: return person["role"] # 未匹配到人员时可根据业务需求返回None,或抛出自定义异常 return None # 调用示例 print(get_role("Tyler")) # 输出 CEO
想要更简洁的写法可以用next()配合生成器表达式,支持自定义默认返回值:
target = "Robin" role = next( (p["role"] for p in participant_data["participants"] if p["name"] == target), default="未找到对应人员" ) print(role) # 输出 analyst
方案2:高频多次查询:预构建姓名-角色映射(查询效率最高)
如果需要频繁根据姓名查询角色,建议先一次性把列表结构转换为以姓名为键、角色为值的字典,后续所有查询都是O(1)的时间复杂度,是性能最优的写法:
# 映射表只需要构建1次 name_to_role = {person["name"]: person["role"] for person in participant_data["participants"]} # 后续查询直接按键取值即可,不需要反复遍历 print(name_to_role.get("James")) # 输出 manager print(name_to_role.get("Bob", "无匹配人员")) # 输出 无匹配人员
注意:如果participants列表中存在重名人员,上述字典推导式的写法会默认保留最后一个出现的重名人员的角色。如果需要兼容重名场景,可以把映射值调整为列表类型,存储所有同名人员对应的角色。
不推荐写法说明
- 直接通过字符串键取列表元素的写法(
participant_data['participants']['Tyler'])本身不符合Python语法:列表仅支持整数索引访问,不支持字符串键直接定位元素 - 硬编码列表索引(
participant_data['participants'][0]['role'])可维护性极差,只要列表顺序调整、新增/删除条目,代码就会取到错误值,生产环境禁止使用。
内容的提问来源于stack exchange,提问作者juanpethes
相关产品推荐
相关产品推荐

