我在某种程度上熟悉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]:
答案 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 ()]
[]