通过使用 Python Glom 过滤其他属性的列表来获取嵌套属性的值
Get value of nested attribute by filtering list on other attribute with Python Glom
我有一个这样的数据对象:
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]))
哪个returns:
[{'name': 'b', 'content': {'id': 'x'}}]
我不知道用什么 spec(用 glom
的说法)提取返回列表中的唯一元素,然后提取 id
.
我可以调用 glom 两次:
glom(glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP]))[0], 'content.id')
但我认为应该有一种方法可以在一次调用中完成。关于如何实现这一点有什么想法吗?
你们非常亲密! glom 链接(你在那里用那个元组做的)的好处是你基本上不需要调用 glom 两次。您可以直接链接:
>>> glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP], '0.content.id'))
'x'
我所做的只是添加第三个元素 '0.content.id'
,它获取第一个项目,然后是内容键,然后是 ID 键。
对于稍微更面向 glom 的方式,您可以将该 lambda 重写为以下内容:
>>> 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
。另外,如果规范越来越长,你可以给它一个很好的描述性变量名:)谢谢你提出的好问题!
我有一个这样的数据对象:
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]))
哪个returns:
[{'name': 'b', 'content': {'id': 'x'}}]
我不知道用什么 spec(用 glom
的说法)提取返回列表中的唯一元素,然后提取 id
.
我可以调用 glom 两次:
glom(glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP]))[0], 'content.id')
但我认为应该有一种方法可以在一次调用中完成。关于如何实现这一点有什么想法吗?
你们非常亲密! glom 链接(你在那里用那个元组做的)的好处是你基本上不需要调用 glom 两次。您可以直接链接:
>>> glom(data, ('props.items', [lambda i: i if i['name']=='b' else SKIP], '0.content.id'))
'x'
我所做的只是添加第三个元素 '0.content.id'
,它获取第一个项目,然后是内容键,然后是 ID 键。
对于稍微更面向 glom 的方式,您可以将该 lambda 重写为以下内容:
>>> 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
。另外,如果规范越来越长,你可以给它一个很好的描述性变量名:)谢谢你提出的好问题!