在Python中迭代时,最有效地向字典添加新键或附加旧键的方法是什么?

3 投票
5 回答
2162 浏览
提问于 2025-04-15 15:00

这里有一个常见的情况,当你从不同的来源收集数据到字典里时:

假设你有一个字典,里面存储着你喜欢的东西的列表:

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 也在 文档中作为一个例子进行了讨论。

撰写回答