我用两种不同的方式编写了以下代码。我试图找到正确的pythonic"这样做的方式。我将解释两者的原因。
第一种方式,EAFP。这个使用了蟒蛇EAFP priciple,但会导致一些代码重复。
try:
my_dict['foo']['bar'] = some_var
except KeyError:
my_dict['foo'] = {}
my_dict['foo']['bar'] = some_var
第二种方式,LBYL。 LBYL并不完全被认为是pythonic,但它删除了代码重复。
if 'foo' not in my_dict:
my_dict['foo'] = {}
my_dict['foo']['bar'] = some_var
哪种方式最好?或者有更好的方法吗?
答案 0 :(得分:8)
我想说经验丰富的Python开发人员会使用
dict.setdefault或collections.defaultdict
my_dict.setdefault('foo', {})['bar'] = some_var
或
from collection import defaultdict
my_dict = defaultdict(dict)
my_dict['foo']['bar'] = some_var
同样为了完整起见,我将向您介绍一种递归defaultdict
模式,它允许无限深度的字典而不会出现任何键错误
>>> from collections import defaultdict
>>> def tree(): return defaultdict(tree)
>>> my_dict = tree()
>>> my_dict['foo']['bar']['spam']['egg'] = 0
>>> my_dict
defaultdict(<function tree at 0x026FFDB0>, {'foo': defaultdict(<function tree at 0x026FFDB0>, {'bar': defaultdict(<function tree at 0x026FFDB0>, {'spam': defaultdict(<function tree at 0x026FFDB0>, {'egg': 0})})})})
答案 1 :(得分:3)
使用defaultdict
#!/usr/bin/env python
from collections import defaultdict
my_dict = defaultdict(dict)
my_dict['foo']['bar'] = "Hello, defaultdict"
print my_dict['foo']['bar']
答案 2 :(得分:2)
更好的解决方案:
my_dict.setdefault('foo', {})['bar'] = some_var
尝试查找python字典get和setdefault方法。
答案 3 :(得分:0)
第二种方式更加pythonic,因为它不会在您知道可能发生错误的情况下抛出错误,并且可能很容易阻止它。