在尊重 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'
我一直在使用从 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'