4

Clojureでは、マップ(dict)を更新して、キーパスassoc-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と同等または同等のショートカットはありますか?(はい、私は危険なdictラッパーを自分で書くことができることを知っていますが、それを避けたいと思います)。

4

2 に答える 2

3

それともこれについて?

def assoc_in(dct, path, value):
    for x in path:
        prev, dct = dct, dct.setdefault(x, {})
    prev[x] = value

def get_in(dct, path):
    for x in path:
        prev, dct = dct, dct[x]
    return prev[x]


d = {}

assoc_in(d, ['a', 'b', 'c'], 33)
print d

x = get_in(d, ['a', 'b', 'c'])
print x
于 2012-05-14T08:18:09.563 に答える
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>, {})
>>> 

orcdict()ではなく空のキーが見つかりませんでしたが、それ以外は同じように動作すると思います。nilNone

reprちょっとした作業でできます!

于 2012-05-14T07:11:15.663 に答える