如果缺少密钥,我可以在字典列表中使用列表理解吗?

时间:2016-01-10 20:44:10

标签: python dictionary counter list-comprehension

我想计算特定值在字典列表中出现的次数。但是,我知道其中一些词典没有关键。我不知道哪个,因为这些是来自API调用的结果。

例如,此代码适用于key1,因为所有字典都有密钥。

from collections import Counter
list_of_dicts = [
    {'key1': 'testing', 'key2': 'testing'},
    {'key1': 'prod', 'key2': 'testing'},
    {'key1': 'testing',},
    {'key1': 'prod',},
    {'key1': 'testing', 'key2': 'testing'},
    {'key1': 'testing',},
]

print Counter(r['key1'] for r in list_of_dicts)

我得到了很好的结果

Counter({'testing': 4, 'prod': 2})

但是,如果我将最后一次打印更改为:

print Counter(r['key2'] for r in list_of_dicts)

失败了,因为几个字典中缺少key2

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    print Counter(r['key2'] for r in list_of_dicts)
  File "h:\Anaconda\lib\collections.py", line 453, in __init__
    self.update(iterable, **kwds)
  File "h:\Anaconda\lib\collections.py", line 534, in update
    for elem in iterable:
  File "test.py", line 11, in <genexpr>
    print Counter(r['key2'] for r in list_of_dicts)
KeyError: 'key2'

如何使用列表推导来计算key2的值,如果字典不包含密钥则不会失败?

2 个答案:

答案 0 :(得分:8)

您可以明确检查字典中是否有key2

Counter(r['key2'] for r in list_of_dicts if 'key2' in r)

答案 1 :(得分:3)

$(($n + 1))可让您指定一个默认值,以便在密钥不存在时返回。因此:

get

In [186]: Counter(r.get('key2',None) for r in list_of_dicts) Out[186]: Counter({'testing': 3, None: 3}) 条目告诉我们有多少字典缺少此值。知道这件事可能会很好。如果你不在乎,你是否使用这个或None条款可能并不重要。