Python中编辑字典值的正确方式

7

我已经用两种不同的方式编写了以下代码。我正在尝试找到使用"正确的Pythonic"的方式来完成它。我将解释两种方法的原因。

第一种方法是EAFP。这种方法使用了Python的EAFP原则,但会导致一些代码重复。

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

哪种方法被认为是最佳的?或者有更好的方法吗?


我会选择第二种方式。重复的代码不好看。如果bar变成了foo,你只需要改一次。 - cdonts
4个回答

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

我喜欢这些选项。通过提供两种解决方案,我可以选择哪种在我的情况下更有效。 (在这种情况下,我不能使用defaultdict,因为字典已经给出) - Nick Humrich

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
更好的解决方案:
my_dict.setdefault('foo', {})['bar'] = some_var

尝试查找Python字典的get和setdefault方法。


0
第二种方法更具有Python风格,因为它不会在你知道可能会出错的地方抛出错误,并且可以轻松地防止这种情况的发生。

它抛出一个异常,该异常由 except 块处理。 - Michael
我不同意,根据PEP8标准,通常使用try-except更为合适。 - Nick Humrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接