繁体   English   中英

你能在Python列表理解中嵌入一下吗?

[英]Can you embed a try in a Python list comprehension?

反正有没有相应的这个?

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

由于字典抛出KeyErrors,如果列表中的元素没有“some_key”属性,我想捕获错误。 我知道我可以通过导入集合并回避异常来创建一个defaultdict,但我想知道这是否可以使用开箱即用的字典。

不,你不能。 你可以只for循环, if是和else

但是你可以做的是使用.get() ,它永远不会引发KeyError:

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

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

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

但是,使用dict.get可以很容易地替换问题中显示的用例:

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

正如其他提到的答案一样,你不能在列表理解中使用try-except。 但作为一种棘手的方法,您可以使用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

演示:

d = Mydefaultdict(None, {4: 'b', 1: 'a'})
print([d[i] for i in [1, 2]])

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM