【问题标题】:Access jsonable nested object with comma separated key使用逗号分隔键访问 jsonable 嵌套对象
【发布时间】:2020-10-19 00:44:02
【问题描述】:

首先让我们创建一个嵌套对象,它可以在 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

注意:可以通过这种方式访问​​numpyarrays。 一旦我尝试使用逗号分隔键访问字典,事情就会中断。

请参阅:Store Slice Index as Object

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

编辑:如果能够使用键更改原始对象中的值也很好:

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

【问题讨论】:

  • Numpy 数组覆盖 __getitem__ 以允许这种语法。 list 不能那样工作。
  • 必须有其他方法来携带访问通用对象的密钥
  • 我还应该补充一点——如果我以后可以用密钥修改原始对象,那将是最有用的。 ExampleObject3[ (0,'b',0,'b') ] = 123 或其他一些新值

标签: python json object indexing key


【解决方案1】:

您不能直接使用这样的键列表进行索引,但您可以创建一个简单的函数来为您完成它。 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

【讨论】:

  • 如果数据是“只读”的,这很好,但我如何使用它覆盖关键位置的数据?
  • 嗯……如果问题很重要,那么在问题中提供这种细节很有帮助。请参阅编辑以了解一种方法。
  • 是的-公平点->问题进一步澄清。 (我认为“访问”意味着“获取”和“设置”,但我现在看到了歧义)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多