在不同来源的字典中编译数据时,这是一种常见情况:
假设你有一个存储事物列表的字典,比如我喜欢的东西:
likes = {
'colors': ['blue','red','purple'],
'foods': ['apples', 'oranges']
}
Run Code Online (Sandbox Code Playgroud)
和第二个字典,其中包含一些相关的值:
favorites = {
'colors':'yellow',
'desserts':'ice cream'
}
Run Code Online (Sandbox Code Playgroud)
然后,您想迭代"favorites"对象,并使用"likes"字典中的相应键将该对象中的项目附加到列表中,或者向其添加一个新键,其值为包含"in"中值的列表.最爱".
做这件事有很多种方法:
for key in favorites:
if key in likes:
likes[key].append(favorites[key])
else:
likes[key] = list(favorites[key])
Run Code Online (Sandbox Code Playgroud)
要么
for key in favorites:
try:
likes[key].append(favorites[key])
except KeyError:
likes[key] = list(favorites[key])
Run Code Online (Sandbox Code Playgroud)
还有更多......
我通常使用第一种语法,因为它感觉更加pythonic,但如果还有其他更好的方法,我很想知道它们是什么.谢谢!
使用collections.defaultdict,其中默认值是新list实例.
>>> import collections
>>> mydict = collections.defaultdict(list)
Run Code Online (Sandbox Code Playgroud)
这样,调用.append(...)将始终成功,因为如果不存在的键append将在新的空列表上调用.
您可以defaultdict使用以前生成的列表实例化,以防您likes从其他来源获取dict ,如下所示:
>>> mydict = collections.defaultdict(list, likes)
Run Code Online (Sandbox Code Playgroud)
请注意,在文档中也将使用list作为a的default_factory属性defaultdict作为示例进行讨论.