当密钥不存在时,为什么我没有得到KeyError?

时间:2016-05-18 01:43:13

标签: python keyerror

在以下测试数据中,我试图追加关键词' 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]

2 个答案:

答案 0 :(得分:2)

没有任何循环不会运行:

>>> 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

答案 1 :(得分:0)

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

for d in ddd:

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

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

您会看到KeyError符合预期。