使用逗号分隔键访问 jsonable 嵌套对象
Access jsonable nested object with comma separated key
首先让我们创建一个嵌套对象,它在 python:
中是 jsonable
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'
您不能像这样直接使用键列表进行索引,但您可以创建一个简单的函数来为您做这件事。 functools.reduce()
对此很方便:
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
首先让我们创建一个嵌套对象,它在 python:
中是 jsonableExampleObject1 = [ {'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'
您不能像这样直接使用键列表进行索引,但您可以创建一个简单的函数来为您做这件事。 functools.reduce()
对此很方便:
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