加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读