在迭代过程中,在Python中添加新密钥或附加到字典中的旧密钥的最有效方法是什么?

在不同来源的字典中编译数据时,这是一种常见情况:

假设你有一个存储事物列表的字典,比如我喜欢的东西:

likes = {
    'colors': ['blue','red','purple'],'foods': ['apples','oranges']
}

和第二个字典,其中包含一些相关的值:

favorites = {
    'colors':'yellow','desserts':'ice cream'
}

然后,您想迭代“favorites”对象,并使用“likes”字典中的相应键将该对象中的项目附加到列表中,或者向其添加一个新键,其值为包含“in”中值的列表最爱”.

做这件事有很多种方法

for key in favorites:
    if key in likes:
        likes[key].append(favorites[key])
    else:
        likes[key] = list(favorites[key])

要么

for key in favorites:
    try:
        likes[key].append(favorites[key])
    except KeyError:
        likes[key] = list(favorites[key])

还有更多……

我通常使用第一种语法,因为它感觉更加pythonic,但如果还有其他更好的方法,我很想知道它们是什么.谢谢!

解决方法

使用 collections.defaultdict,其中认值是新的列表实例.

>>> import collections
>>> mydict = collections.defaultdict(list)

通过这种方式,调用.append(…)将始终成功,因为如果存在不存在的键,则将在新的空列表上调用append.

您可以使用之前生成的列表来实例化defaultdict,以防您从其他来源获得dict喜欢,如下所示:

>>> mydict = collections.defaultdict(list,likes)

请注意,使用list作为defaultdict的default_factory属性也将在documentation中作为示例进行讨论.

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...