相当于Clojure在Python中的“assoc-in”和“get-in”

时间:2012-05-14 06:46:26

标签: python clojure

在Clojure中,您可以使用assoc-in更新地图(dict),并在不存在的情况下自动创建关键路径。

(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包装,但我想避免使用它。)

2 个答案:

答案 0 :(得分: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可以做一些工作!

答案 1 :(得分:1)

或者关于这个?

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