【发布时间】:2017-04-17 23:05:32
【问题描述】:
我正在使用 boto3 进行 python AWS Cognito 实施。 IdToken 上的jwt.decode 产生一个字典形式的有效负载,如下所示:
{
"sub": "a uuid",
"email_verified": True,
"iss": "https://cognito-idp....",
"phone_number_verified": False,
"cognito:username": "19407ea0-a79d-11e6-9ce4-09487ca06884",
"given_name": "Aron Filbert",
"aud": "my client app",
"token_use": "id",
"auth_time": 1480547504,
"nickname": "Aron Filbert",
"phone_number": "+14025555555",
"exp": 1480551104,
"iat": 1480547504,
"email": "my@email.com"
}
所以我设计了一个使用该字典的用户类。效果很好,直到我需要再次点击 Cognito 并获取新的用户详细信息以确保没有任何变化(例如,从另一台设备)。我从get_user() 调用返回的有效负载最终看起来像一个字典列表:
[
{
"Name": "sub",
"Value": "a uuid"
},
{
"Name": "email_verified",
"Value": "true"
},
{
"Name": "phone_number_verified",
"Value": "false"
},
{
"Name": "phone_number",
"Value": "+114025555555"
},
{
"Name": "given_name",
"Value": "Aron Filbert"
},
{
"Name": "email",
"Value": "my@email.com"
}
]
由于我可能经常使用get_user() Cognito 端点,因此我正在寻找一种有效的方法来获取列表中每个字典的值并使用它们来形成新字典的键:值。示例:
{
"sub": "a uuid", # From first list item
"email_verified": True, # From next list item
...
}
作为 Python 新手,我正在为如何优雅高效地完成这项工作而苦苦挣扎。
【问题讨论】:
-
首先你应该简单而低效地做,然后担心改进(这就是你学习的方式)。您是否尝试过直接/蛮力的方法?
-
完全同意。我问的原因是因为我使用我不熟悉的后端有点截止日期。我编写了一个快速迭代器来完成我的任务,并考虑使用
any(),但希望有一个更 Pythonic 的解决方案 -
{k["Name"]:k["Value"] for k in list_of_dicts_from_get_user}? -
但是您必须将字符串布尔值转换为实际的布尔值等;这是一个不同的问题(但当然可以在相同的字典理解中完成)。
-
成功了。谢谢!
标签: python list dictionary merge