Python 使用逗号分隔键访问JSO嵌套对象

Python 使用逗号分隔键访问JSO嵌套对象,python,json,object,indexing,key,Python,Json,Object,Indexing,Key,首先,让我们创建一个嵌套对象,该对象在python中是可编程的: ExampleObject1 = [ {'a':0, 'b':1} , {'c':2, 'd':3} ] ExampleObject2 = [ {'a':0, 'b':ExampleObject1}, {'c':2, 'd':3} ] ExampleObject3 = [ {'a':0, 'b':ExampleObject1}, {'c':ExampleObject2, 'd':3} ] 我们可以轻松访问带有链接方括号的元素,

首先,让我们创建一个嵌套对象,该对象在python中是可编程的:

ExampleObject1 = [ {'a':0, 'b':1} ,  {'c':2, 'd':3} ]
ExampleObject2 = [ {'a':0, 'b':ExampleObject1}, {'c':2, 'd':3} ]
ExampleObject3 = [ {'a':0, 'b':ExampleObject1}, {'c':ExampleObject2, 'd':3} ]
我们可以轻松访问带有链接方括号的元素,如下所示:

print ( ExampleObject3[0]['b'][0]['b'] )

>>> 1
如何使用键列表访问同一元素,而不需要方括号

print ( ExampleObject3[ (0,'b',0,'b') ] )

>>> TypeError: list indices must be integers or slices, not tuple
注意:我可以通过这种方式访问
numpy
array
s。 当我试图使用逗号分隔键访问字典时,一切都中断了

请参阅:

原因:我只想能够传递任意键,该键可用于以后从内存中的某个大型对象获取数据

编辑:也可以使用以下键更改原始对象中的值:

ExampleObject3[ (0,'b',0,'b') ] = 'alpha'

您不能像这样直接使用键列表进行索引,但是您可以制作一个简单的函数来为您进行索引。在这方面很方便:

from functools import reduce

def fromKeyList(obj, key_list):
    return reduce(lambda o, k: o[k], key_list, obj)

ExampleObject1 = [ {'a':0, 'b':1} ,  {'c':2, 'd':3} ]
ExampleObject2 = [ {'a':0, 'b':ExampleObject1} ,  {'c':2, 'd':3} ]
ExampleObject3 = [ {'a':0, 'b':ExampleObject1} ,  {'c':ExampleObject2, 'd':3} ]

fromKeyList(ExampleObject3, (0,'b',0,'b'))
# 1
fromKeyList(ExampleObject3, (1,'c',0,'b',1, 'c'))
# 2
根据进一步信息进行编辑

要设置项目,可以从键列表中获取除最后一个项目以外的所有项目,然后使用最后一个键设置项目。这可能看起来像:

def setFromKeyList(obj, key_list, val):
    last = reduce(lambda o, k: o[k], key_list[:-1], obj)
    last[key_list[-1]] = val

fromKeyList(ExampleObject3, (0,'b',0,'b'))
# 1

setFromKeyList(ExampleObject3, (0,'b',0,'b'), 10)

fromKeyList(ExampleObject3, (0,'b',0,'b'))
#10

Numpy数组覆盖
\uuuu getitem\uuu
以允许此语法<代码>列表不是这样工作的。必须有其他方法来携带密钥以访问一般对象,我还应该添加-如果我以后可以使用密钥修改原始对象,这将非常有用。例如Object3[(0,'b',0,'b')]=123或其他一些新值如果数据是“只读”的,这很好,但是我如何使用它覆盖关键位置的数据?嗯……如果重要的话,这就是问题中有用的细节。请参阅编辑一种方法。是的-公平点->问题进一步澄清。(我假设“访问”意味着“获取”和“设置”,但我现在明白了其中的歧义)