【问题标题】:Why didn't I get a KeyError when the key did not exist?当密钥不存在时,为什么我没有收到 KeyError?
【发布时间】:2016-05-18 01:43:12
【问题描述】:

在以下测试数据中,我尝试将键“x”值附加到列表 ls。我的问题是为什么我在循环数据的第一行时没有得到 KeyError 。显然,第一行不包含键“x”。本来我以为我必须使用 Try/Except 来避免在循环数据时出错,但似乎不需要 Try/Except。

谁能帮我理解为什么这里没有生成 KeyError?

data = [{u'xyz': []},
        {u'xyz': [{u'x' : 2,
                   u'y' : 3, 
                   u'z' : 4}]}]

ls = []

for item in data:
    ddd = item['xyz']
    print ddd

    for d in ddd:
        ls.append(d['x'])

ls

输出:

[]
[{u'y': 3, u'x': 2, u'z': 4}]

[2]

【问题讨论】:

    标签: python keyerror


    【解决方案1】:

    没有任何内容的循环不会运行:

    >>> for item in []:
    ...     print item
    ...
    >>>
    

    所以

    data = [{u'xyz': []},
                ...       ]
    
    
    # first time through
    for item in data:
        ddd = item['xyz']
    
        # ddd is an empty list
    
        for d in ddd:
            # this doesn't run, therefore no KeyError
            ls.append(d['x'])
    

    如果您想捕获 KeyError,则需要尝试/排除,如果您想避免,您可以这样做:

    if 'x' in d:  # test if 'x' is a key in d
    
    or
    
    d.get('x')    # returns the value, or None
    

    【讨论】:

      【解决方案2】:

      第一行是一个空列表,没有KeyError,因为其中没有字典。所以循环:

      for d in ddd:
      

      未输入。尝试将第一行更改为:

      data = [{u'xyz': [{}]},
      

      您会按预期看到KeyError

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-04
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        相关资源
        最近更新 更多