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[]
你可以在这里使用三元条件:
([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中,三元条件.
您可以使用前面的 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)