gpt4 book ai didi

python - 正在寻找可能更好的方法来使用 Glom 获取嵌套数据?

转载 作者:行者123 更新时间:2023-12-01 06:55:46 30 4
gpt4 key购买 nike

我有一个来自系统的特别讨厌的统计对象,我需要从中检索数据(为简洁起见,显示了许多统计条目中的两个)。

 'https://localhost/mgmt/tm/sys/performance/all-stats/TMM%20Memory%20Used': {'nestedStats': {'entries': {'Average': {'description': '5'},
'Current': {'description': '5'},
'Max(since 2019_11_12T02:47:10Z)': {'description': '5'},
'Memory Used': {'description': 'TMM '
'Memory '
'Used'}}}},
'https://localhost/mgmt/tm/sys/performance/all-stats/Utilization': {'nestedStats': {'entries': {'Average': {'description': '9'},
'Current': {'description': '10'},
'Max(since 2019_11_12T02:47:10Z)': {'description': '53'},
'System CPU Usage': {'description': 'Utilization'}}}}}

目前我在嵌套堆栈中多次使用 .get 方法,但我正在听 glom module 的作者的话这个周末谈论 Python 并认为这对我来说可能是一个更干净的解决方案。确实如此,因为这段代码使得我可以将所有数据放在一个循环中,而无需疯狂的 get 方法层(上面图片中的第一个示例是我今晚正在处理的)。外键是长 URL,内键是 avg/current/max/desc。

stats = b.tm.sys.performances.all_stats.load()
for k, v in stats.entries.items():
print('\n')
spec = f'entries.{k}.nestedStats.entries'
v_stats = glom(stats, spec)
for k, v, in v_stats.items():
spec = f'{k}.description'
stat_vals = glom(v_stats, spec)
print(f'{k}: {stat_vals}')

哪个结果是我需要的数据:

Average: 5
Current: 5
Max(since 2019_11_12T02:47:10Z): 5
Memory Used: TMM Memory Used

也就是说,我目前无法真正控制数据,我只是打印它。我认为我还没有体会到 glom 的力量,并且很好奇是否有人可以给我指出一个有助于我理解的例子?最终目标是将所有这些数据扁平化为包含 4 个项目字典的单个列表。

最佳答案

首先,在尝试此操作之前,请确保 glom 已更新到当前版本 19.11.0 或更高版本。

你所要求的,被glom的文档称为数据驱动分配,而不是glom的优势。

请参阅 Glom 文档 here

要使其正常工作,您可能需要 lambda 和/或常规 Python 代码。

下面是我的工作尝试,将示例行复制到变量 d 中。

from glom import glom, Call, T, Iter

d = { ... } # put your example lines into this dictionary.

def get_desc(subdict):
return {k: v.get('description', None)
for k,v in subdict[1]['nestedStats']['entries'].items()}

spec = (Call(list, args=(T.items(),) ), Iter().map(get_desc).all())

result = glom(d, spec)

print(result)

结果

[
{'Average': '5', 'Current': '5', 'Max(since 2019_11_12T02:47:10Z)': '5', 'Memory Used': 'TMM Memory Used'},
{'Average': '9', 'Current': '10', 'Max(since 2019_11_12T02:47:10Z)': '53', 'System CPU Usage': 'Utilization'}
]

更新

下面的版本获得相同的结果,但不需要辅助函数。

规范的作用:

  • 调用将外部字典转换为元组列表
  • Iter 循环遍历列表。对于每个项目:
    1. 获取元组的第二个元素
    2. 获取nestedStats.entries(这是另一个字典)
    3. 调用将此字典转换为元组列表
    4. 将此列表转换为带有键和描述的字典列表
    5. 将字典列表合并为一个字典
  • 获取迭代的所有结果

我建议尝试这个并删除部分规范,看看会发生什么......

from glom import glom, Call, T, Iter, merge

# d = { ... } # put your example lines into this dictionary.

spec = (
Call(list, args=(T.items(),)),
Iter(
(
T[1],
"nestedStats.entries",
Call(list, args=(T.items(),)),
[{T[0]: (T[1], "description")}],
merge,
)
).all(),
)

result = glom(d, spec)

print(result)

关于python - 正在寻找可能更好的方法来使用 Glom 获取嵌套数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58811895/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com