2016-05-18 74 views
1

在下面的测试数据中,我试图将密钥'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

在没有一个循环不运行:

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

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

for d in ddd: 

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

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

你会看到KeyError预期。

相关问题