2017-07-25 17 views
1

我一直在使用從json解析的嵌套數組。 每當我嘗試訪問數據中的值時,這最終會產生一條巨大的線。 假設我在var數據中有一個嵌套數組,當我嘗試達到更深的值時,我仍然必須尊重80個字符的限制。我想要做的就是讀取或修改值。現在在尊重pep8的同時訪問嵌套數組中的值的最優化方式是什麼?

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

,我想到了兩個可能的解決方案,我可以使用:使用臨時瓦爾然後

1-拆分它reasign的數據,一旦我做前:

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

我想這個解決方案會使用來自所有複製的內存的相當多的資源。

2-使用exec函數在python實現,並且在多行上分割字符串:

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

我不知道如何優化是exec函數。什麼是最pythonic /優化的方式來做到這一點?在尊重pep8的同時還有其他更好的方法來達到目標​​嗎?

+2

我看到它,該方式是,如果你運行像flake8或相似的,事情過去,你好。除此之外,這一切都將是意見的問題。 – idjaw

回答

1

(有點長了評論)你不需要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。其實,永遠不要使用它。


在某些情況下,保持一分字典的參考作品,如果你是經常一次又一次地訪問您的數據結構的一部分。根據情況和情況決定採用什麼樣的最佳解決方案是一個問題。

+0

不錯!我知道這是批處理和cmd存在的,但由於某種原因,我認爲這在python中不存在。我很確定這是做到這一點的最好也是最簡單的方法。謝謝 :)! –

+1

@AlexandreMercierAubin在大部分情況下,這樣做可以提高可讀性,而不必使用像exec這樣的陰謀手段。但就像idjaw所說,這是一個意見問題,最適合這種情況。只要你確認PEP,做你覺得最好的事情。 –

1

您的第一個選項正處於正確的軌道,並不像您想象的那樣耗費內存。在python大部分東西都是在內存中的地方引用,所以讓我們說我們有這個JSON BLOB(在python字典):

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

現在,如果你想改變這種嵌套的「富」關鍵的兩個部分,你可以首先做一個參考,以它:

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

然後,它是非常簡單的,只是

foo_ref['count'] += 1 
foo_ref['color'] = 'green' 
相關問題