【问题标题】:Combine just values of list of python dictionaries into single dictionary仅将 python 字典列表的值组合到单个字典中
【发布时间】: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


【解决方案1】:

正如我在评论中指出的,您的大部分工作可以通过 dict 理解来完成:

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

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

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}

同样的事情可以在理解本身中完成,但它不会更清晰,也没有效率。这样,如果您后来意识到在存储之前还想对有效负载执行其他操作,您就可以对密钥进行额外的操作。

【讨论】:

    【解决方案2】:

    正如安德拉斯在上面回答的那样,字典理解是一种简单的 Pythonic 单行代码,适合您的案例。但是,一些样式指南 (such as Google's) 建议不要使用它们,如果它们会引入复杂的逻辑或占用超过两三行代码:

    可以用于简单的情况。每个部分必须适合一行: 映射表达式、for 子句、过滤器表达式。多个为 不允许使用子句或过滤器表达式。改用循环 当事情变得更复杂时。

    是的:

    result = []
    for x in range(10):
        for y in range(5):
            if x * y > 10:
                result.append((x, y))
    
    for x in xrange(5):
        for y in xrange(5):
            if x != y:
                for z in xrange(5):
                    if y != z:
                        yield (x, y, z)
    
    return ((x, complicated_transform(x))
            for x in long_generator_function(parameter)
            if x is not None)
    
    squares = [x * x for x in range(10)]
    
    eat(jelly_bean for jelly_bean in jelly_beans
        if jelly_bean.color == 'black')
    

    否:

    result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]
    
    return ((x, y, z)
            for x in xrange(5)
            for y in xrange(5)
            if x != y
            for z in xrange(5)
            if y != z)
    

    字典理解在您的实例中非常合适,但为了完整起见,如果您决定做一些更有趣的事情,这是使用几个 for 循环执行操作的通用方法:

    for <dict> in <list>:
        for <key>, <value> in <dict>:
            # Perform any applicable operations.
            <new_dict>[<key>] = <value>
    

    结果...

    user = get_user()
    user_info = {}
    
    for info in user:
        for name, value in info:
            n, v = info[name], info[value]
            if v.lowercase() == 'true':
                v = True
            else if v.lowercase() == 'false':
                v = False
            user_info[n] = v
    

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2019-05-16
      • 2017-04-11
      • 2020-08-05
      相关资源
      最近更新 更多