代码之家  ›  专栏  ›  技术社区  ›  Pablo

通过使用Python Glom筛选其他属性上的列表来获取嵌套属性的值

  •  2
  • Pablo  · 技术社区  · 7 年前

    我有这样一个数据对象:

    data = {
        'props': {
            'items': [
                {'name': 'a', 'content': 'plain'},
                {'name': 'b', 'content': {'id': 'x'}},
                {'name': 'c', 'content': {'id': 'y'}},
            ]
        }
    }
    

    使用 glom ,我想 x 它的价值是多少 id 对于带有 name 等于 b .

    from glom import glom
    from glom import SKIP
    
    
    glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP]))
    

    返回:

    [{'name': 'b', 'content': {'id': 'x'}}]
    

    规格 (在 (术语)用于提取返回列表中的唯一元素,然后提取 身份证件 .

    我可以给格洛姆打两次电话:

    glom(glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP]))[0], 'content.id')
    

    1 回复  |  直到 6 年前
        1
  •  6
  •   Mahmoud Hashemi    7 年前

    你非常接近!glom链接的好处是(您正在使用那里的元组)基本上不需要调用glom两次。您可以直接通过以下链接:

    >>> glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP], '0.content.id'))
    'x'
    

    我所做的只是添加了第三个元素 '0.content.id' ,它获取第一个项,然后是内容键,然后是id键。

    >>> glom(data, ('props.items', [Check('name', equal_to='b', default=SKIP)], '0.content.id'))
    'x'
    

    >>> glom(data, ('props.items', [Check('name', equal_to='z', default=SKIP)], Check(default=STOP), '0.content.id'))
    []
    

    别忘了导入 Check STOP 如果你走那条路。另外,如果规范越来越长,您可以给它一个很好的描述性变量名:)谢谢您的提问!