实际上,您的结构是一个字典列表。
>>> 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