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

Var*_*rma 4 python list-comprehension

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

例如

tags = v.tags
if tags:
    for t in tags:
        if t['Key'] == 'Name':
            # Do something
Run Code Online (Sandbox Code Playgroud)

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

[k for k,v in tags if tags]:
Run Code Online (Sandbox Code Playgroud)

Ev.*_*nis 10

这个怎么样:

[k for k in (tags or [])]
Run Code Online (Sandbox Code Playgroud)

如果不是>>> tags = None:

>>> [k for k in (tags or [])]
[]
Run Code Online (Sandbox Code Playgroud)

这有效的原因是因为tags = [1, 2, 3]返回.否则它返回第二个参数,即使它的布尔值也是.(tags or [])tagsbool(tags) == True[]


Rig*_*leg 5

你可以在这里使用三元条件:

([k for k, v in tags] if tags is not None else [])
Run Code Online (Sandbox Code Playgroud)

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

[k for k, v in (tags if tags is not None else [])]
Run Code Online (Sandbox Code Playgroud)

作为旁注,[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)
Run Code Online (Sandbox Code Playgroud)

输出:

is_empty
is_empty
is_empty
is_empty
is_empty
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

你在语义上寻找的是内联if,即在Python中,三元条件.


Mos*_*oye 5

您可以使用前面的 if 块进行测试

if tags is not None:
   ...
Run Code Online (Sandbox Code Playgroud)

或者用空的可迭代短路

>>> tags = None
>>> [k for k, _ in tags or ()]
[]
Run Code Online (Sandbox Code Playgroud)