Python:用Lambda表达式处理字典列表的ZeroDivisionError与KeyError
处理字典列表除法的异常场景
1. 除数为0的场景(无else分支)
Lambda本身不支持直接编写try-except块,但可以通过过滤不符合条件的项来避免else分支,只处理除数不为0的字典:
x = [{'a':10,'b':5},{'a':6,'b':4},{'a':5,'b':0}] # 先过滤出b不为0的项,再执行除法 result = list(map(lambda y: y['a']/y['b'], filter(lambda y: y.get('b') != 0, x))) # 输出: [2.0, 1.5]
如果需要保留原列表的位置(不跳过项),可以用嵌套Lambda返回特定默认值(比如float('inf')):
result = list(map(lambda y: (lambda a,b: a/b)(y['a'], y['b']) if y['b'] !=0 else float('inf'), x)) # 输出: [2.0, 1.5, inf]
2. 同时处理KeyError和ZeroDivisionError
方式1:辅助函数+Lambda(可读性最优)
定义一个包含异常处理的辅助函数,在Lambda中调用它,这是最清晰的方案:
def safe_div(d): try: return d['a'] / d['b'] except (KeyError, ZeroDivisionError): return None # 可替换为你需要的默认值,如0、inf x = [{'a':10,'b':5},{'a':6,'b':4},{'b':1}, {'a':5,'b':0}] # 保留所有位置,异常项返回None result = list(map(lambda y: safe_div(y), x)) # 输出: [2.0, 1.5, None, None] # 或者过滤掉异常项,只保留有效结果 result = list(filter(lambda val: val is not None, map(lambda y: safe_div(y), x))) # 输出: [2.0, 1.5]
方式2:纯Lambda(无外部函数)
如果坚持只用Lambda,可通过提前检查键存在性和除数不为0来避免异常,无需else分支的话就结合过滤:
x = [{'a':10,'b':5},{'a':6,'b':4},{'b':1}, {'a':5,'b':0}] # 先过滤出同时包含a、b且b不为0的项,再执行除法 valid_items = filter(lambda y: 'a' in y and 'b' in y and y['b'] != 0, x) result = list(map(lambda y: y['a']/y['b'], valid_items)) # 输出: [2.0, 1.5]
如果需要保留位置,只能用带else的条件判断(这是权衡后的选择):
result = list(map(lambda y: y['a']/y['b'] if ('a' in y and 'b' in y and y['b'] !=0) else None, x)) # 输出: [2.0, 1.5, None, None]
内容的提问来源于stack exchange,提问作者Ashish Kumar
相关产品推荐
相关产品推荐

