Python中列表理解的错误处理

Python中列表理解的错误处理,python,python-3.x,generator,Python,Python 3.x,Generator,是否有一种方法可以处理python列表理解中的错误。最好是这样,最后两个值用None表示: values = [try i ["row"] except KeyError None for i in [{"row" : 1}, {"Row" : 0}, {}]] 这会引发语法错误,我唯一能做的就是: values = [] for i in [{"row" : 1}, {"Row" : 0}, {}]: try: values.append (i ["row"]) except

是否有一种方法可以处理python列表理解中的错误。最好是这样,最后两个值用
None
表示:

values = [try i ["row"] except KeyError None for i in [{"row" : 1}, {"Row" : 0}, {}]]
这会引发语法错误,我唯一能做的就是:

values = []
for i in [{"row" : 1}, {"Row" : 0}, {}]:
    try: values.append (i ["row"])
    except KeyError: values.append (None)

我希望有一种更“整洁”的方法来做到这一点,因为当前的解决方案并不可取,因为当列表理解以这样一种好的方式完成时,必须附加到空白列表中

无法从列表()捕获异常。但是如果您想做什么,您可以使用
get

values = [i.get("row") for i in [{"row" : 1}, {"Row" : 0}, {}]]

如果在dictionary
get
中找不到该键,则返回
None
,这正是您要查找的内容(它可以返回您想要的任何内容,只需将默认值作为第二个参数传递,请参见)

您还可以在列表理解中检查该键是否为dictionary,如果不存在,则返回
None

key = 'row'
values = [i[key] if key in i else None for i in [{"row" : 1}, {"Row" : 0}, {}]]

不能在列表理解中直接处理异常,因为
try
是一条语句,而不是表达式

但是,您可以将
try
提取到单独的函数中:

def tryirow(i):
    try: return i["row"]
    except KeyError: return None

values = [tryirow(i) for i in [{"row" : 1}, {"Row" : 0}, {}]]

当然,在本例中,正如所暗示的,您刚刚重新实现了内置的
dict.get
方法:

values = [i.get("row") for i in [{"row" : 1}, {"Row" : 0}, {}]]
但这说明了如何更普遍地解决类似的问题:如果有一个函数可以满足您的需求,请调用它;如果没有,写下来


当然,有时,“为语句写一个
”实际上是正确的答案。并不是所有的东西都应该写在一个列表中,甚至很多东西都可以。我认为这与此无关,但值得记住


实际上,有人建议添加一个
try
表达式,就像您试图编写的表达式一样。为什么被拒绝?因为几乎所有的用例都是“使用默认回退获取”用例,其中您想要的函数已经存在(比如
dict.get
)或者应该存在。没有人能想出一个通用用例,它不是用单独的函数或扩展的
for
语句编写的


在一种全新的语言中,我认为有一个
try
表达式,而不是像
dict.get
这样的方法会更有意义,但在一种语言中,在有人提出
try
表达式之前已经有了
dict.get
十多年了(在有人提出具体建议之前几乎有二十年),这将是一个糟糕的更改。

代码中没有生成器。你的意思是列表理解吗?1)我更改了我的问题,因为我的意思是列表理解2)我不介意列表中是否有
None
,因为我正在检查返回的值