gpt4 book ai didi

python - 如何处理任意嵌套深度的字典属性?

转载 作者:行者123 更新时间:2023-12-01 04:06:26 28 4
gpt4 key购买 nike

我正在解析一个 json -> dict 对象,该对象具有任意深度嵌套的值。例如,外层是“name”、“sprint_team”等字段(数据来自客户服务票务系统)...但对于某些字段,它们有一个嵌套的 dict 将具有“id”、“value”等值...

我将其全部放入一个平面文件中,然后复制到 AWS Redshift,但我正在尝试找出一种有效的方法来处理我可能需要的所有不同嵌套级别的值。我正在考虑使用查找表,例如:

lookup = {
'customfield_12700': ('sprint_team', 'name'),
'customfield_13208': ('department', 'sub_department', 'name')
}

其中 value[0] 始终是查找名称,然后可以有 n 个额外参数作为我的嵌套级别。我首先使用查找表的原因是 Jira 使用自定义字段,我需要将它们映射到我们的云数据库中的列名称。例如,在 sprint_team 字段中,我需要平面文件的 name 属性等...

如何创建一个函数,该函数将采用字典对象,然后使用查找表返回我需要的值,无论它的嵌套深度如何?

最佳答案

类似这样的吗?

这使用了您的查找表想法,并且只是一次向下导航一层。

>>> data = {"foo": {"bar": {"baz": 1}}}
>>> lookup = {
... 'customfield': ("foo", "bar", "baz" )
... }

>>> def nest(data, name):
... path = lookup[name]
... d = data
... for p in path:
... d = d[p]
... return d
...
>>> nest(data, 'customfield')
1

这也可以递归地完成,这应该没问题,除非你的字典嵌套非常!

def nest(data, path):
if len(path) == 0:
return data
else:
return nest(data[path[0]], path[1:])

def find(data, name):
return nest(data, lookup[name])

>>>find(data, 'customfield')
1

或者,使用时髦的函数方法:

>>> from operator import itemgetter
>>> from functools import reduce
>>> def compose(*functions):
... return reduce(lambda f, g: lambda x: f(g(x)), functions, lambda x: x)

>>> nest = compose(*[itemgetter(name) for name in reversed(lookup['customfield'])])
>>> nest(data)
1

itemgetter 提供访问具有指定名称的属性的函数。 compose 将这些函数组合在一起,形成一个提取嵌套数据的函数。

您还可以预先生成这些函数并将它们存储在 lookup 中而不是路径中,以便在需要时可以直接使用它们。

(我们必须定义自己的 compose 函数,因为 Python 没有内置函数)。

关于python - 如何处理任意嵌套深度的字典属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35515339/

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