将 glom 库与 Python 一起使用:将列表结果转换为具有由 Python 函数生成的键的字典
Using the glom library with Python: Turning a list result into a dictionary with key generated by a Python function
我正在使用 Python 库 glom 从包含列表的字典中提取数据。
这个问题是关于理解 glom 如何与 用户定义的函数 一起工作以及我如何从列表中移动数据 进入 glom 中的词典。
例如,我尝试将数据直接转换为字典。
# in the real world, this data has way many more fields
data = {'vessels': [{'aisStatic': {'mmsi': 1, 'name': 'name1'}},
{'aisStatic': {'mmsi': 2, 'name': 'name2'}}],
'timestamp': None}
# this is the glob spec to extract the data
spec = ('vessels',[({'mmsi':'aisStatic.mmsi','name':'aisStatic.name'})])
# an example to generate a new key based on data & position
def keyfunc(i, v):
return f"v{i}-{v['mmsi']}"
result = glom(data, spec)
wanted_result = {keyfunc(i,v): v for i, v in enumerate(result)}
想要的结果是这样的
{'v0-1': {'mmsi': 1, 'name': 'name1'}, 'v1-2': {'mmsi': 2, 'name': 'name2'}}
例如,我在 glom 之外使用理解来获得想要的结果,因为 glom returns 是一个列表。
我正在寻找一种通过 glom 规范直接获得相同结果的方法。
一个可行的解决方案是在 enumerate 函数上使用 Invoke。
from glom import merge, Invoke
data = {
"vessels": [
{"aisStatic": {"mmsi": 1, "name": "name1"}},
{"aisStatic": {"mmsi": 2, "name": "name2"}},
],
"timestamp": None,
}
spec = (
"vessels",
[{"mmsi": "aisStatic.mmsi", "name": "aisStatic.name"}],
Invoke(enumerate).specs(T),
[lambda x: {f"v{x[0]}-{x[1].get('mmsi')}": x[1]}],
merge,
)
print(glom(data, spec))
哪个returns请求的结果
{'v0-1': {'mmsi': 1, 'name': 'name1'}, 'v1-2': {'mmsi': 2, 'name': 'name2'}}
我正在使用 Python 库 glom 从包含列表的字典中提取数据。
这个问题是关于理解 glom 如何与 用户定义的函数 一起工作以及我如何从列表中移动数据 进入 glom 中的词典。
例如,我尝试将数据直接转换为字典。
# in the real world, this data has way many more fields
data = {'vessels': [{'aisStatic': {'mmsi': 1, 'name': 'name1'}},
{'aisStatic': {'mmsi': 2, 'name': 'name2'}}],
'timestamp': None}
# this is the glob spec to extract the data
spec = ('vessels',[({'mmsi':'aisStatic.mmsi','name':'aisStatic.name'})])
# an example to generate a new key based on data & position
def keyfunc(i, v):
return f"v{i}-{v['mmsi']}"
result = glom(data, spec)
wanted_result = {keyfunc(i,v): v for i, v in enumerate(result)}
想要的结果是这样的
{'v0-1': {'mmsi': 1, 'name': 'name1'}, 'v1-2': {'mmsi': 2, 'name': 'name2'}}
例如,我在 glom 之外使用理解来获得想要的结果,因为 glom returns 是一个列表。
我正在寻找一种通过 glom 规范直接获得相同结果的方法。
一个可行的解决方案是在 enumerate 函数上使用 Invoke。
from glom import merge, Invoke
data = {
"vessels": [
{"aisStatic": {"mmsi": 1, "name": "name1"}},
{"aisStatic": {"mmsi": 2, "name": "name2"}},
],
"timestamp": None,
}
spec = (
"vessels",
[{"mmsi": "aisStatic.mmsi", "name": "aisStatic.name"}],
Invoke(enumerate).specs(T),
[lambda x: {f"v{x[0]}-{x[1].get('mmsi')}": x[1]}],
merge,
)
print(glom(data, spec))
哪个returns请求的结果
{'v0-1': {'mmsi': 1, 'name': 'name1'}, 'v1-2': {'mmsi': 2, 'name': 'name2'}}