我有一段代码正在迭代一个列表然后根据键在dict中累积值,丑陋的部分是我需要检查dict中是否已经存在键,如果没有那么我需要首先将值设置为零。
我想知道是否有更优雅的风格来实现这个:
for r in records:
if not d.has_key(r[0]):
d[r[0]] = 0
d[r[0]] += r[1]
此外,如果值是列表,那么如何重写以下代码:
for (key, value) in records:
if not d.has_key(key):
d[key] = []
d[key].append(value)
答案 0 :(得分:3)
您可以使用内置dict.get
方法获取默认值,例如
for r in records:
d[r[0]] = d.get(r[0], 0) + r[1]
dict.get
的第二个参数是如果字典中没有键,则返回默认值。
更好的是,您可以解压缩值,例如
for (key, value) in records:
d[key] = d.get(key, 0) + value
答案 1 :(得分:3)
这是在python中使用dicts时的常见模式,因此集合模块中有 defaultdict 。这允许您为不在字典中的键指定默认值。 e.g:
from collections import defaultdict
d = defaultdict(int)
d[10] += 1
In [19]: dict(d)
Out[19]: {10: 1}
如您所见,如果使用defaultdict,则无需检查dict中是否存在密钥。
d = defaultdict(int)
for r in records:
d[r[0]] += r[1]