2012-05-14 9 views
3

Clojureでは、マップ(dict)をassoc-inで更新し、存在しなければ自動的にキーパスを作成できます。 get-inのための同じClojureの "assoc-in"とPythonの "get-in"に相当する

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

:あなたは、キー(またはリストインデックス)のパスを指定することができますし、それが存在しない場合には、パス、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に相当するものか、同等のショートカットがありますか? (はい、私は自分自身dodgy dictラッパーを書くことができることを知っているが、私はそれを避けたい)。

答えて

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>, {}) 
>>> 

むしろnilまたはNoneよりも、見つからないキーの空のcdict()を返しますが、そうでない場合、私はそれが同じ動作をしますと思います。

reprはちょっとした作業を行うことができます。

関連する問題