Python 3.x:使用 lambda 表达式处理错误

Python 3.x: Error handling with lambda expression

提问人:Ashish Kumar 提问时间:9/15/2022 更新时间:9/15/2022 访问量:90

问:

我是python的新手,目前正在学习一些映射数据类型。如果使用了任何不相关的关键字,请原谅我。

有字典列表,需要执行一些操作并需要返回结果。以下解决方案运行良好,但在特定条件下会产生问题 -

>>> x = [{'a':10,'b':5},{'a':6,'b':4},{'a':5,'b':1}]
>>> list(map(lambda y: y['a']/y['b'], x))
[2.0, 1.5, 5.0]

现在dict x有问题。这是来自其他来源 (api) 的输入,并且很有可能有 2 种情况 -

  1. 0可以来哪个地方抛出异常。lambda 表达式中有什么要处理的吗?bZeroDivisionError

我尝试了以下选项if/else -

>>> x = [{'a':10,'b':5},{'a':6,'b':4},{'a':5,'b':0}]
>>> list(map(lambda y:y['a']/y['b'] if (y.get("b") != 0) else None, x))
[2.0, 1.5, None]

我不确定这是否是一个理想的解决方案,因为需要额外的编码来处理值。请建议最合适的解决方案,这些解决方案在 lambda 表达式中没有条件。Noneelse


  1. 输入中可能缺少一种可能性。它抛出aKeyError-
>>> x = [{'a':10,'b':5},{'a':6,'b':4},{'b':1}]
>>> list(map(lambda y: y['a']/y['b'], x))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
KeyError: 'a'

请建议同时处理这两种情况。其他替代方法可以轻松处理这种情况,但如果可能的话,我想坚持使用 lambda 表达式。提前感谢您的帮助。

python-3.x 函数 lambda 闭包

评论


答:

1赞 RoadieRich 9/15/2022 #1

您可以在构造中使用复杂的表达式:a if b else c

result = list(map(lambda y: y['a']/y['b'] if (y.get("b") != 0) and 'a' in y else None, x))

最好的办法是创建一个要传递的辅助函数,而不是试图强制 lambda 执行您想要的操作。map

def mapping_function(d):
   if d.get('b', 0) == 0 or 'a' not in d:
       return None
   else:
       return d['a']/d['b']

result = list(map(mapping_function, x))

但是,如果您坚持使用 ,则无法避免出现在列表中。如果改为使用列表推导式,则可以省略无效的词典:Nonemap

result = [d['a']/d['b'] for d in x if d.get('b', 0) == 0 or 'a' not in d]

当然,您也可以使用它们来删除它们:filter

result = list(filter(lambda v: v is not None, map(lambda y: y['a']/y['b'] if (y.get("b") != 0) and 'a' in y else None, x)))