2012-05-14 44 views
3

在Clojure中,您可以使用assoc-in更新地圖(字典),並在不存在的情況下自動創建關鍵路徑。Clojure在Python中的「assoc-in」和「get-in」的等效代碼

(assoc-in {:a 1 :b 3} [:c :d] 33) 
{:a 1, :c {:d 33}, :b 3} 

同爲get-in:您可以指定鍵(或列表索引)的路徑,它將返回路徑所指定的值,nil如果它不存在。

(get-in {:a 1, :c {:d 33}, :b 3} [:c :d]) 
33 
(get-in {:a 1, :c {:d 33}, :b 3} [:c :e]) 
nil 

是否有Python等價物或可比較的快捷方式? (是的,我知道我可以自己寫一些狡猾的詞典包裝,但我想避免它)。

回答

2

這個怎麼樣?

>>> from collections import defaultdict 
>>> def cdict(): 
...  return defaultdict(cdict) 
... 
>>> d = cdict() 
>>> d['a']=1 
>>> d['b']=3 
>>> d 
defaultdict(<function cdict at 0x28d3ed8>, {'a': 1, 'b': 3}) 
>>> d['c']['d'] = 33 
>>> d['c']['d'] 
33 
>>> d 
defaultdict(<function cdict at 0x28d3ed8>, {'a': 1, 'c': defaultdict(<function cdict at 0x28d3ed8>, {'e': defaultdict(<function cdict at 0x28d3ed8>, {}), 'd': 33}), 'b': 3}) 
>>> d['c']['e'] 
defaultdict(<function cdict at 0x28d3ed8>, {}) 
>>> 

它返回鍵上的一個空cdict()沒有找到,而不是nilNone但除此之外,我認爲它的行爲是相同的。

repr可以做一點工作!