如何从字典的字典中获取值的详细信息

问题描述 投票:0回答:5

我的字典在下面

x={
    "contacts":{
        "101":{
            "email":"[email protected]",
            "firstName":"Leo",
            "lastName":"Messi",
            "role":["Owner"]
        }
    }
}
  • 如果“角色”是“所有者”,我需要提取电子邮件

代码如下

for i in (x.values()):
    for i,j in i.items():
        if 'Owner' in j['role']:
            print(j['email'])

有没有什么方法可以在不迭代超过2次的情况下进行提取

python
5个回答
0
投票

对于问题中显示的数据,您可以简单地这样做:

x = {
    "contacts": {
        "101": {
            "email": "[email protected]",
            "firstName": "Leo",
            "lastName": "Messi",
            "role": ["Owner"]}
    }
}

if 'Owner' in x['contacts']['101']['role']:
    print(x['contacts']['101']['email'])

...尽管我怀疑您真正想要的是与“联系人”关联的列表值


0
投票

您可以使用列表理解来提取“所有者”联系人的所有电子邮件

  emails = [contact_dict['email'] for contact_dict in x['contacts'].values() if 'Owner' in contact_dict['role']]

0
投票

python 中有一些包可以更有效地做到这一点,例如,您可以将字典加载到 pandas 数据框中,然后您将能够更好地操作它。使用基本的 Python 工具,你必然会遇到循环或理解。


0
投票

与您的意思最接近的解决方案可能是这样的:

x = {
    "contacts": {
        "101": {
            "email": "[email protected]",
            "firstName": "Leo",
            "lastName": "Messi",
            "role": ["Owner"]}
    }
}

for j in x['contacts'].values():
    if 'Owner' in j['role']:
        print(j['email'])

此代码正确打印

[email protected]
.

我的解决方案

  • 使目标数据完全在x['contacts'].values(),
    内的小
    假设
  • 仅依赖于一个简单的循环,并且
  • 使用
    items()
    方法,该方法返回字典的(键,值)对的所谓视图。

Viliam Popovec 的答案在结构上相同,但以所谓的“列表理解”形式编写。


0
投票

可以通过模式匹配来完成:

match x:
    case {"contacts": {"101": {"role": [*roles]}}} if "Owner" in roles:
        print(x["contacts"]["101"]["email"])
© www.soinside.com 2019 - 2024. All rights reserved.