python – 为什么我在这个生成器中得到一个KeyError?
发布时间:2020-12-20 11:33:31 所属栏目:Python 来源:网络整理
导读:我有以下字典: d = { 'A': { 'param': { '1': { 'req': True,},'2': { 'req': True,'B': { 'param': { '3': { 'req': True,'4': { 'req': False,} 我想要一个生成器,它将为我提供每个第一级键,所需的参数. req = {}for key in d: req[key] = (p for p in d[
我有以下字典:
d = { 'A': { 'param': { '1': { 'req': True,},'2': { 'req': True,'B': { 'param': { '3': { 'req': True,'4': { 'req': False,} 我想要一个生成器,它将为我提供每个第一级键,所需的参数. req = {} for key in d: req[key] = (p for p in d[key]['param'] if d[key]['param'][p].get('req',False)) 所以在这里,对于d中的每个键,只有当req为True时才得到参数p. 但是,当我尝试使用我的生成器时,它会引发KeyError异常: >>> req {'A': <generator object <genexpr> at 0x27b8960>,'B': <generator object <genexpr> at 0x27b8910>} >>> for elem in req['A']: ... print elem --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-a96226f95cce> in <module>() ----> 1 for elem in req['A']: 2 print elem 3 <ipython-input-4-1732088ccbdb> in <genexpr>((p,)) 1 for key in d: ----> 2 req[key] = (p for p in d[key]['param'] if d[key]['param'][p].get('req',False)) 3 KeyError: '1' 解决方法
您分配给req [key]的生成器表达式绑定在键变量上.但循环中从’A’到’B’的关键变化.迭代第一个生成器表达式时,它会在if条件下计算“B”键,即使在创建时键为“A”.
绑定到变量值而不是其引用的传统方法是将表达式用默认值包装在lambda中,然后立即调用它. for key in d: req[key] = (lambda key=key: (p for p in d[key]['param'] if d[key]['param'][p].get('req',False)))() 结果: 1 2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |