在尊重 pep8 的同时访问嵌套数组中的值的最优化方法是什么?

What would be the most optimised way to access values in a nested array whilst respecting pep8?

我一直在使用从 json 解析的嵌套数组。 每次我尝试访问数据中的值时,这最终都会给出一条巨大的线。 假设我在 var 数据中有一个嵌套数组,当我尝试达到更深的值时,我仍然必须遵守 80 个字符的限制。我只想读取或修改值。

self.data["name1"]["name2"][varWithNumber][varWithNumber2][varWithNumber3]

现在,我考虑了两种可能的解决方案:

1- 使用临时变量拆分它,然后在完成后将其重新分配给数据 ex:

tempData=self.data["name1"]["name2"][varWithNumber]
tempData[varWithNumber2][varWithNumber3]+=1
self.data["name1"]["name2"][varWithNumber]=tempData

我想这个解决方案会使用大量复制的内存中的资源。

2- 使用 python 中实现的 exec 函数并将字符串拆分为多行:

exec ('self.data'+
      '["name1"]'+
      '["name2"]'+
      '[varWithNumber]'+
      '[varWithNumber2]'+
      '[varWithNumber3]+=1')

我不知道 exec 函数的优化程度如何。最 pythonic/optimised 的方法是什么?在尊重 pep8 的同时,是否有任何 other/better 方法可以达到目标?

(评论有点长)你不需要 exec 来做......你可以使用行继续操作符:

self.data["name1"]\
         ["name2"]\
         [varWithNumber]\
         [varWithNumber2]\ 
         [varWithNumber3]

演示:

In [635]: x = [[[[1, 2, 3]]]]

In [636]: x[0]\
     ...:  [0]\
     ...:  [0]\
     ...:  [0]
Out[636]: 1

这似乎是最简单、最干净的方法。

除非万不得已,否则不要使用 exec。实际上,永远不要使用它。


在某些情况下,如果您要频繁地一次又一次地访问数据结构的那部分,保留对子字典的引用是可行的。这是一个决定在特定情况下应用什么是最佳解决方案的问题。

您的第一个选择是正确的,它并不像您想象的那样占用大量内存。 python 中的大多数内容都是对内存中位置的引用,所以假设我们有这个 json blob(python 中的字典):

test = {
    "name1": {
        "name2": {
            "foo": {
                "count": 1,
                "color": "red"
            }
        }
    }
}

现在,如果您想更改嵌套 "foo" 键的两个部分,您可以先使用以下方法对其进行引用:

foo_ref = test['name1']['name2']['foo']

那么就很简单了

foo_ref['count'] += 1
foo_ref['color'] = 'green'