是否可以针对此特定情况捕获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
之外,还有办法解决这个问题吗?
答案 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