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

时间:2017-04-07 15:24:51

标签: python python-3.x dictionary

无论如何都要做相同的事情吗?

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

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

3 个答案:

答案 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