将python词典列表的值组合成单个词典

时间:2016-12-02 23:21:16

标签: python list dictionary merge

我正在使用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"
}

所以我设计了一个消耗该字典的User类。效果很好,直到我需要再次点击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不熟悉,我正在努力学习如何优雅高效地完成这项任务。

1 个答案:

答案 0 :(得分:2)

正如我在评论中所指出的,你的大部分工作都可以通过词典理解来完成:

lst = get_user() # or something similar, lst is a list of dicts
parsed_res = {k["Name"]:k["Value"] for k in lst}

这仅与您的预期输出不同,因为它包含'true''false',而您希望在最终结果中使用bool。嗯,最简单的解决方案是定义一个为您执行此转换的函数:

def boolify(inp):
    if inp=='true':
        return True
    elif inp=='false':
        return False
    else:
        return inp

parsed_res = {k["Name"]:boolify(k["Value"]) for k in lst}

同样的事情可以在理解本身中完成,但它不会更清晰,也不会有效。这样,如果您以后发现在存储之前还有其他想要对有效负载执行的操作,则可以在密钥中执行其他操作。