正确的编辑字典值python的方法

时间:2014-07-17 18:11:02

标签: python pep8

我用两种不同的方式编写了以下代码。我试图找到正确的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

哪种方式最好?或者有更好的方法吗?

4 个答案:

答案 0 :(得分:8)

我想说经验丰富的Python开发人员会使用

dict.setdefaultcollections.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,因为它不会在您知道可能发生错误的情况下抛出错误,并且可能很容易阻止它。