You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何根据JSON对象已知同级键值查找对应另一同级属性

你提到的循环遍历思路是可行的基础实现,根据查询场景的不同,有更清晰、更适配业务需求的规范写法,按需选择即可。

首先先修正你示例代码里的两个问题:

  1. Robin对应的字典条目末尾缺失逗号,会触发语法错误
  2. 不建议用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:45:48