Python - 检查对象是否为None并进行列表理解

时间:2017-06-28 15:41:46

标签: python list-comprehension

我在某种程度上熟悉Python中的列表推导。但是在我需要检查列表是否为None的情况下,列表理解会失败。

e.g。

tags = v.tags
if tags:
    for t in tags:
        if t['Key'] == 'Name':
            # Do something

现在,如果标签为None,则以下列表推导失败。如果标签为空/ [],它可以正常工作。我想要一个列表理解,检查无。

[k for k,v in tags if tags]:

3 个答案:

答案 0 :(得分:8)

这个怎么样:

>>> tags = None
>>> [k for k in (tags or [])]
[]

如果不是None

>>> tags = [1, 2, 3]
>>> [k for k in (tags or [])]
[1, 2, 3]

这可行的原因是因为 tags or []仅在tags时才会返回bool(tags) == True。否则它返回第二个参数[],即使它的布尔值也是False

答案 1 :(得分:5)

您可以在此处使用三元条件:

([k for k, v in tags] if tags is not None else [])

你也可以在理解中嵌入三元条件:

[k for k, v in (tags if tags is not None else [])]

作为旁注,[k for k, v in tags if tags]并不像您期望的那样真实。 列表推导的if子句在每次迭代时都会被计算,这意味着会为其中的每个元素检查tags的真值。

证明这一点:

l = [1, 2, 3, 4, 5]

def is_empty(l):
    print("is_empty")
    return len(l) > 0

m = [i for i in l if is_empty(l)]

print(m)

输出:

is_empty
is_empty
is_empty
is_empty
is_empty
[1, 2, 3, 4, 5]

你在语义上寻找的内联if,就是在Python中,是一种三元条件。

答案 2 :(得分:4)

您可以使用前面的if块

进行测试
if tags is not None:
   ...

短路,其中包含空迭代:

>>> tags = None
>>> [k for k, _ in tags or ()]
[]