你能在Python列表中嵌入一个try吗?

你能在Python列表中嵌入一个try吗?,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,有没有办法做到这一点 my_list = [try: my_dict["some_key"] except KeyError: 0 for my_dict in my_list] 由于字典抛出keyrerrors,如果列表中的元素没有“some_key”属性,我希望捕获错误。我知道我可以通过导入集合和避开异常来创建defaultdict,但我想知道,使用现成的字典是否可以做到这一点。不,您不能在列表理解中直接这样做。必须将try/except逻辑分解为单独的函数,然后调用该函数 不过,您的问题

有没有办法做到这一点

my_list = [try: my_dict["some_key"] except KeyError: 0 for my_dict in my_list]

由于字典抛出keyrerrors,如果列表中的元素没有“some_key”属性,我希望捕获错误。我知道我可以通过导入集合和避开异常来创建defaultdict,但我想知道,使用现成的字典是否可以做到这一点。

不,您不能在列表理解中直接这样做。必须将try/except逻辑分解为单独的函数,然后调用该函数

不过,您的问题中显示的用例有一个简单的替代方案,使用
dict.get

my_list = [my_dict.get('some_key', 0) for my_dict in my_list]

不,你不能。只能将
放入
循环、
if
else

但是,您可以做的是使用,它不会抛出一个键错误:

my_list = [my_dict.get("some_key", 0) for my_dict in my_list]

第二个参数是密钥不存在时的默认值。如果未指定默认值,则默认值为无。

正如前面提到的其他答案一样,除了在列表中,您不能使用try。但作为一种棘手的方法,您可以使用
collections.defaultdict()
并重写
\uuu missing\uuuu
属性以捕获异常。以下是一个例子:

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
演示:


谢谢,我最后使用了这个。如果使用if参数来检查键是否在dict中,而不是使用get来尝试所有键,会更快吗?@Varlor使用值if键存在,如果不存在,则使用0,这正是
get
所做的。手动操作可能不会明显变慢,但我认为不会更快。或者只使用
defaultdict(int)
@zondo No!我们只想覆盖
\uuuu missing\uuuu
方法。使用
int
作为默认工厂函数不会给我们期望的行为。期望的行为是在键不存在时得到0。不过,添加密钥可能是不希望的。
d = Mydefaultdict(None, {4: 'b', 1: 'a'})
print([d[i] for i in [1, 2]])

2 doesn't exist
['a', None]