如何在具有lambda函数的python循环中捕获KeyError?

时间:2018-06-09 21:08:09

标签: python python-3.x

是否可以针对此特定情况捕获KeyError x['uri']

joined_rooms = ('coala/coala', 'coala/coala-bears')
room_data = [{'id': '130', 'uri': 'coala/coala'},
             {'id': '234', 'name': 'Nitanshu'},
             {'id': '897', 'uri': 'coala/coala-bears'}]

for room in filter(lambda x: x['uri'] in joined_rooms, room_data):
    #do stuff

这样做:

try:
    for room in filter(lambda x: x['uri'] in joined_rooms, room_data):
        #do stuff
except KeyError:
    pass

将在KeyError被提升后跳过所有项目。

除了使用for loops迁移到经典嵌套if condition之外,还有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

Python dict有一个get方法适用于这种场合。它需要两个参数,第一个是您要查找的键,第二个是在字典中不存在键时使用的默认值。试试这个:

for room in filter(lambda x:x.get('uri',None) in joined_rooms, room_data):
    #do stuff

这里的问题,虽然在您的情况下可能不是问题,但您需要提供一个默认值,永远不会出现在joined_rooms中。

答案 1 :(得分:1)

如上所述,如果字典中不存在某个键,则可以使用dict.get返回默认值。如果未提供,则此默认值为None

作为替代方案,您可以使用生成器表达式。这比filter + lambda表达更有效。它也可能更具可读性:

for room in (x for x in room_data if x.get('iri') in joined_rooms):
    # do something

另一个完全有效的解决方案是在if循环中使用for语句:

for room in room_data:
    if 'iri' in room:
        # do something