在字典中创建键(如果不存在)

时间:2019-06-25 17:36:24

标签: python dictionary

我有一个字典,其中有5个键['total_rows', 'rows_failed', 'dup_rows_skipped', 'total_inserts', 'total_updates'] 像下面这样说

    {'CO_issuers': {'total_rows': 1, 'rows_failed': 0, 'dup_rows_skipped': 0, 'total_inserts': 0, 'total_updates': 1}, 
'DC_issuers': {'total_rows': 1, 'rows_failed': 1}}

每个键ex-CO_issuers将具有5个键,如上所述。如果前一个密钥{-DC_issuers没有密钥,则应将其密钥添加为0

我走了这么远,我在那儿遍历字典,并检查所有键是否存在

for key, value in mail_stats.items():
    if all(key in mail_stats for key in("total_rows", "rows_failed", "dup_rows_skipped", "total_inserts", "total_updates")):

在浏览时,可以发现使用下面的代码,我们可以简单地做到这一点,但是无法适应我的情况。

if key not in d:
    d[key] = value

如何做到这一点。

2 个答案:

答案 0 :(得分:4)

defaultdict是您最好的选择。

from collections import defaultdict

tallies = {"CO_issuers": defaultdict(int), "DC_issuers": defaultdict(int)}

不过,要清楚一点,这将与您预期的有所不同。特别是->默认dict实例不会具有所有键。但是,它们将允许您检索任何任意密钥。如果键不存在,它将获得传入的默认值的返回值。因此,tallies['DC_issuers']['not_present']将返回0

要包含评论,您可以通过以下方式使其更加强大:

tallies = defaultdict(lambda: defaultdict(int))

在此版本中,每次您访问tallies时,都会创建一个新的defaultdict创建整数。实际的计数是通过tallies[group][item] += 1完成的,如果从未设置过,则检索任何值将返回0,但对于存在的任何值都将返回正确的值。

答案 1 :(得分:0)

mail_stats = {'CO_issuers': {'total_rows': 1, 'rows_failed': 0, 'dup_rows_skipped': 0, 'total_inserts': 0, 'total_updates': 1}, 
'DC_issuers': {'total_rows': 1, 'rows_failed': 1}}

您可以遍历每个键,并检查是否不存在更新。

    for key, value in mail_stats.items():
        print(key, value)
        if 'dup_rows_skipped' not in value:
            value['dup_rows_skipped'] = 0
        if 'total_inserts' not in value:
            value['total_inserts'] = 0
        if 'total_updates' not in value:
            value['total_updates'] = 0

    print('Updated dict', mail_stats)

更新字典-

 Updated dict {'CO_issuers': {'total_rows': 1, 'rows_failed': 0, 'dup_rows_skipped': 0, 'total_inserts': 0, 'total_updates': 1}, 
'DC_issuers': {'total_rows': 1, 'rows_failed': 1, 'dup_rows_skipped': 0, 'total_inserts': 0, 'total_updates': 0}}