python - 在嵌套结构上使用Glom,如何将顶级字典字段移动到字典列表中?
问题描述
这是一个关于Glom使用的问题(https://github.com/mahmoud/glom/)
我有一本包含其他词典列表的词典。
{'date': '2020-01-01',
'location': 'A',
'items': [
{'name': 'A', 'id': 'A1'},
{'name': 'B', 'id': 'B1'},
{'name': 'C', 'id': 'C1'}
]}
我想使用Glom将外部的全局字典字段“日期”和“位置”移动到项目的字典列表中。
这是我试图达到的最终结果
[
{'name': 'A', 'id': 'A1', 'date': '2020-01-01', 'location': 'A'},
{'name': 'B', 'id': 'B1', 'date': '2020-01-01', 'location': 'A'},
{'name': 'C', 'id': 'C1', 'date': '2020-01-01', 'location': 'A'}
]
唉,当规范到达字典的“项目”时,其他值不再可访问,而是将 T 对象设置为内部值。
from glom import glom, T
def update_dict(x, other_dict):
x.update({'date': other_dict['date'], 'location': other_dict['location']})
return x.copy()
spec = (T, 'items', [(lambda x: update_dict(x, T()))])
data = {'date': '2020-01-01',
'location': 'A',
'items': [{'name': 'A', 'id': 'A1'},
{'name': 'B', 'id': 'B1'},
{'name': 'C', 'id': 'C1'}]}
glom(data, spec) # print this
返回
[{'name': 'A', 'id': 'A1', 'date': T()['date'], 'location': T()['location']},
{'name': 'B', 'id': 'B1', 'date': T()['date'], 'location': T()['location']},
{'name': 'C', 'id': 'C1', 'date': T()['date'], 'location': T()['location']}]
这是没用的。
使用常规 Python 代码更新字典并不难,但有没有办法在Glom规范中做到这一点?
解决方案
诀窍是将目标也作为全局范围传递,这样,Assign
命令就可以访问完整的目标。
from glom import S, glom, Assign, Spec
spec = ('items',
[Assign( 'date', Spec(S['date']))],
[Assign( 'location', Spec(S['location']))]
)
target = {'date': '2020-04-01',
'location': 'A',
'items': [
{'name': 'A', 'id': 'A1'},
{'name': 'B', 'id': 'B1'},
{'name': 'C', 'id': 'C1'}
]}
spec = Spec(('items', [Assign( 'date', Spec(S['date']))], [Assign( 'location', Spec(S['location']))]))
glom(target, spec, scope=target)
结果是
[{'name': 'A', 'id': 'A1', 'date': '2020-04-01', 'location': 'A'},
{'name': 'B', 'id': 'B1', 'date': '2020-04-01', 'location': 'A'},
{'name': 'C', 'id': 'C1', 'date': '2020-04-01', 'location': 'A'}]
推荐阅读
- linux - Linux - grep 函数
- css - 突出显示链接 a:hover:after 上的动画
- python - 如何使用 tqdm 显示 while 循环的进度?
- c++ - 通过命令行安装 CMake 时出现“No rule to maketarget”
- c# - 首先在 EF6 代码中创建多对多关系
- sql - 带有上个月行的 TSQL 滚动总和
- owasp - 如何使用 OWASP 的 Zap 代理中的 HUD 处理 HTTP 站点
- angular - 角数管道是否将数字转换为阿拉伯语?
- python - 如何使用 python matplotlib 绘制正态分布的直方图?
- python - 'charmap' 编解码器无法对位置 108 中的字符 '\ufb01' 进行编码:字符映射到