确实,您的结构是一个字典列表。
>>> lst = [{'a': 5}, {'b': 6}, {'c': 7}, {'d': 8}]
为了更好地了解您的第一种情况发生了什么,试试这个:
>>> gen = (itm for itm in lst if itm['a'] == 5)
>>> next(gen)
{'a': 5}
>>> next(gen)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
KeyError: 'a'
每次调用next,都会处理下一个元素并返回一个项目。还有……
next((itm for itm in lst if itm['a'] == 5))
创建一个未分配给任何变量的生成器,处理lst 中的第一个元素,看到键'a' 确实存在,并返回该项目。然后生成器被垃圾收集。没有抛出错误的原因是lst 中的第一项确实包含此密钥。
因此,如果您将密钥更改为第一项不包含的内容,则会收到您看到的错误:
>>> gen = (itm for itm in lst if itm['b'] == 6)
>>> next(gen)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
KeyError: 'b'
解决方案
嗯,已经讨论过的一种解决方案是使用dict.get 函数。这是使用defaultdict 的另一种选择:
from collections import defaultdict
from functools import partial
f = partial(defaultdict, lambda: None)
lst = [{'a': 5}, {'b': 6}, {'c': 7}, {'d': 8}]
lst = [f(itm) for itm in lst] # create a list of default dicts
for i in (itm for itm in lst if itm['b'] == 6):
print(i)
打印出来:
defaultdict(<function <lambda> at 0x10231ebf8>, {'b': 6})
如果密钥不存在,defaultdict 将返回 None。