2010-06-26 24 views
11

谷歌和在線文檔都無法提供有關我的查詢的更多信息,所以我想我會問這裏的社區。在一個詞典中,你如何模仿Perl的自動生動行爲?

在Perl中,你可以輕鬆地設置散列的-A-哈希的-A-哈希和測試,像這樣的最後一個關鍵:

my $hash = {}; 
$hash{"element1"}{"sub1"}{"subsub1"} = "value1"; 
if (exists($hash{"element1"}{"sub1"}{"subsub1"})) { 
    print "found value\n"; 
} 

什麼是Python中的 '最佳實踐' 等價?

回答

14

最接近的等效可能是類似以下內容:

import collections 

def hasher(): 
    return collections.defaultdict(hasher) 

hash = hasher() 
hash['element1']['sub1']['subsub1'] = 'value1' 
if 'subsub1' in hash['element1']['sub1']: 
    print 'found value' 
+3

請注意,如果在hash ['phony']'中的sub1創建了一個key''phony''。這可能是有問題的,特別是因爲OP要測試密鑰是否存在...... – unutbu 2010-06-26 03:24:23

+0

@〜unutbu:OP詢問:「test the * final * key」,因此'hash ['element1'] ['sub1'] = dict(subsub1 ='value1')'會做。 – jfs 2010-06-26 03:56:31

+0

謝謝,這很有幫助。 – jbb 2010-06-26 08:32:19

5

至於這是否是Python中的最佳實踐是高達辯論:

hash = {} 
hash['element1', 'sub1', 'subsub1'] = 'value' 
if ('element1', 'sub1', 'subsub1') in hash: 
    print "found value" 

但是,可以肯定的作品,是非常優雅,如果它適合你。

主要缺點是您沒有中間訪問權限。您無法做:

if ('element1', 'sub1') in hash: 
    print "found value" 
+1

你應該解釋發生了什麼。這是一個帶有3元素[tuple](http://docs.python.org/library/functions.html#tuple)作爲關鍵字的單個散列/字典。真的不是同一件事,儘管你有點用第二個例子來表示。 – 2010-06-26 03:32:00

+0

〜unutbu指出,在Alex Martelli的回答中處理「缺點」(如果你認爲是這樣)有趣的方法。 – 2010-06-26 05:35:26

+0

事實上,這不是我正在尋找的 - 但有趣的。謝謝你的提示。 – jbb 2010-06-26 08:33:24

0

我不知道我是否會得到任何協議,但是這是我怎麼通常聲明詞典的詞典:

someObj = { 
    'element1': { 
    'sub1': { 
     'subsub1': 'value1' 
    } 
    } 
} 

至於檢查的元件的存在,我同意這種方法:

try: 
    someObj['element1']['sub1']['subsub1'] 
except KeyError: 
    print('no value found') 
else: 
    print('found value') 
3
from collections import defaultdict 

tree = lambda: defaultdict(tree) 

t = tree() 

t[1][2][3] = 4 
t[1][3][3] = 5 
t[1][2]['test'] = 6 

wikipedia Autovivification

+1

除了使用'lambda',這與3年前接受的答案有什麼不同呢? – MattH 2013-08-16 10:42:51