You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:50:24