我的字典在下面
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次的情况下进行提取
对于问题中显示的数据,您可以简单地这样做:
x = {
"contacts": {
"101": {
"email": "[email protected]",
"firstName": "Leo",
"lastName": "Messi",
"role": ["Owner"]}
}
}
if 'Owner' in x['contacts']['101']['role']:
print(x['contacts']['101']['email'])
...尽管我怀疑您真正想要的是与“联系人”关联的列表值
您可以使用列表理解来提取“所有者”联系人的所有电子邮件
emails = [contact_dict['email'] for contact_dict in x['contacts'].values() if 'Owner' in contact_dict['role']]
python 中有一些包可以更有效地做到这一点,例如,您可以将字典加载到 pandas 数据框中,然后您将能够更好地操作它。使用基本的 Python 工具,你必然会遇到循环或理解。
与您的意思最接近的解决方案可能是这样的:
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 的答案在结构上相同,但以所谓的“列表理解”形式编写。
可以通过模式匹配来完成:
match x:
case {"contacts": {"101": {"role": [*roles]}}} if "Owner" in roles:
print(x["contacts"]["101"]["email"])