无论如何都要做相同的事情吗?
my_list = [try: my_dict["some_key"] except KeyError: 0 for my_dict in my_list]
由于字典抛出了KeyErrors,如果列表中的元素没有" some_key"我想要捕获错误。属性。我知道我可以通过导入集合并回避异常来创建一个defaultdict,但我想知道这是否可以使用开箱即用的字典。
答案 0 :(得分:6)
不,你不能。您只能放置for
个圈,if
&{39}和else
。
你可以做的是使用.get()
,它永远不会引发KeyError:
my_list = [my_dict.get("some_key", 0) for my_dict in my_list]
第二个参数是密钥不存在时的默认值。如果您未指定默认值,则默认默认值为“无”。
答案 1 :(得分:4)
不,你不能直接在列表理解中这样做。您必须将try / except逻辑分解为单独的函数,然后调用该函数。
使用dict.get
时,您的问题中显示的用例有一个简单的替代方法:
my_list = [my_dict.get('some_key', 0) for my_dict in my_list]
答案 2 :(得分:1)
正如其他提到的答案,你不能在列表理解中使用try-except。但作为一种棘手的方法,您可以使用com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?, ?, ?, ?, ?, ?, ?)' at line 1
并覆盖collections.defaultdict()
属性以捕获异常。这是一个例子:
__missing__
演示:
from collections import defaultdict
class Mydefaultdict(defaultdict):
def __init__(self, *args, **kwargs):
super(Mydefaultdict, self).__init__(*args, **kwargs)
def __getitem__(self, key):
try:
return defaultdict.__getitem__(self, key)
except KeyError:
return self.__missing__(key)
def __missing__(self, key):
# Instead of printing you can catch your exceptions in any way you like
print("{} doesn't exist".format(key))
if self.default_factory:
return self.default_factory() # You can rturn whatever you want here