2013-04-24 62 views
13

什麼是pep8兼容深層字典訪問的方式?pep8兼容深層字典訪問

dct = { 
    'long_key_name_one': { 
     'long_key_name_two': { 
      'long_key_name_three': { 
       'long_key_name_four': { 
        'long_key_name_five': 1 
       } 
      } 
     } 
    } 
} 

E501線過長(118> 80個字符)之前

print dct['long_key_name_one']['long_key_name_two']['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

E211空白 '['

print dct['long_key_name_one']['long_key_name_two']\ 
    ['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

E124右括號不匹配視覺壓痕

print dct['long_key_name_one']['long_key_name_two' 
    ]['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

這通過pep8但似乎不太理想

print dct['long_key_name_one']['long_key_name_two'][ 
    'long_key_name_three' 
]['long_key_name_four']['long_key_name_five'] 

有沒有辦法打破這條線,使它看起來不錯,並符合pep8?

+2

如果鍵已經在列表中,並且您知道該值存在,那麼您可以:'value = reduce(dict.get,keys,dct)'。 – jfs 2013-04-25 05:53:20

回答

6

也許不是最好的方式,但它的工作原理:

a = dct['long_key_name_one']['long_key_name_two'] 
b = a['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

但是這也適用,這是建議的方法:

print (dct['long_key_name_one']['long_key_name_two'] 
     ['long_key_name_three']['long_key_name_four'] 
     ['long_key_name_five']) 
+1

我認爲第一種方式是最好的選擇。除此之外,最好的選擇是更好地設計你的數據結構,所以你首先不會遇到這種情況。沒有那麼多的情況下,你有一個5層深的對象樹,其中沒有一箇中間層對他們自己有用 - 而且,如果你有這種情況,你最好使用樹迭代器或DOM風格的搜索比這種訪問。 – abarnert 2013-04-24 23:59:31

+0

如果您需要設置一個值,第一種方法不會對您有所幫助。 – tponthieux 2013-04-25 04:54:09

+0

@tponthieux:當然可以。 'a'只是'dct'中內部字典的名稱。在這種情況下,a [k] = v'相當於'dct ['long_key_name_one'] ['long_key_name_two'] [k] = v'。 – jfs 2013-04-25 05:53:56

3

如果你用它在函數內部(和你可以使用print()作爲函數,因爲2.7 afaik)

您可以在括號內使用隱式拼接

print(dct['long_key_name_one'] 
     ['long_key_name_two'] 
     ['long_key_name_three'] 
     ['long_key_name_four'] 
     ['long_key_name_five'])