如果字典键不存在,创建字典键的简便方法

6

我有一本动物园动物词典。 我想把它放在一个嵌套的字典中,但是因为该物种尚未添加到字典中,所以出现了KeyError。

def add_to_world(self, species, name, zone = 'retreat'):
    self.object_attr[species][name] = {'zone' : zone}

有没有快捷方式来检查字典中是否有该物种并在没有时创建它,还是我必须手动检查是否已添加该物种?


1
一个物种可能有多个名称吗? - Hugh Bothwell
3个回答

14
def add_to_world(self, species, name, zone = 'retreat'):
    self.object_attr.setdefault(species, {})[name] = {'zone' : zone}

当我尝试 print {}.setdefault('species', {})['name'] = {'zone' : 'thezone'} 时,我遇到了一个 SyntaxError 错误。我在这里有什么误解吗? - kramer65
在Python中,赋值不是表达式,不能在print语句中使用。 - kindall
也就是说,你需要做类似这样的事情 d ={}; d.setdefault('species', {})['name'] = {'zone': 'thezone'}; print d - kindall

11

这是使用defaultdict并将字典作为值的示例。

>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> d["species"]["name"] = {"zone": "1"}
>>> d
defaultdict(<type 'dict'>, {'species': {'name': {'zone': '1'}}})
>>>

如果您想要更深层次的嵌套,您需要编写一个返回defaultdict(dict)的函数。

def nested_defaultdict():
    return defaultdict(dict)

# Then you can use a dictionary nested to 3 levels
d2 = defaultdict(nested_defaultdict)
d2["species"]["name"]["zone"] = 1

9

3
谢谢你提供这个单词——自动声明。 - Sri Kadimisetty
只是在打印时不太美观:defaultdict(<function <lambda> at 0x02379DF0>, {'2013-11-29': defaultdict(<type 'dict'>, {'USG': D... - gseattle
有没有一个相对不那么晦涩的西班牙语单词等价物? - WestCoastProjects

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