在Python中迭代时,最有效地向字典添加新键或附加旧键的方法是什么?
这里有一个常见的情况,当你从不同的来源收集数据到字典里时:
假设你有一个字典,里面存储着你喜欢的东西的列表:
likes = {
'colors': ['blue','red','purple'],
'foods': ['apples', 'oranges']
}
还有一个第二个字典,里面有一些相关的值:
favorites = {
'colors':'yellow',
'desserts':'ice cream'
}
接下来,你想要遍历“favorites”这个对象,把里面的项目添加到“likes”字典中对应键的列表里,或者如果没有这个键,就新建一个键,值是一个包含“favorites”中值的列表。
有几种方法可以做到这一点:
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])
还有很多其他的方法...
我一般使用第一种写法,因为感觉更符合Python的风格,但如果有其他更好的方法,我很想知道。谢谢!
5 个回答
2
除了 defaultdict,普通的字典还有一个功能(可能看起来有点奇怪):dict.setdefault(k[, d])
:
for key, val in favorites.iteritems():
likes.setdefault(key, []).append(val)
谢谢你们给我+20的声望 -- 我在30秒内从1989涨到了2009。让我们记住,自从欧洲的墙倒下已经过去20年了。
3
使用 collections.defaultdict:
import collections
likes = collections.defaultdict(list)
for key, value in favorites.items():
likes[key].append(value)
defaultdict
需要一个参数,这个参数是一个工厂函数,用来在你访问一个未知的键时自动创建值。比如说,list
就是一个这样的函数,它会创建空列表。
而使用 .items() 来遍历,会让你不需要单独用键去获取值。
5
使用 collections.defaultdict
,并把默认值设置为一个新的 list
实例。
>>> import collections
>>> mydict = collections.defaultdict(list)
这样一来,调用 .append(...)
方法就一定能成功,因为如果你试图在一个不存在的键上调用 append
,它会在一个全新的空列表上执行。
如果你是从其他地方获取的字典 likes
,你也可以用之前生成的列表来创建 defaultdict
,像这样:
>>> mydict = collections.defaultdict(list, likes)
注意,使用 list
作为 default_factory
属性的 defaultdict
也在 文档中作为一个例子进行了讨论。