Python 如何检查对象是否不在列表中?
我对Python中的列表理解有些熟悉。但是当我需要检查列表是否为“无”时,列表理解就会失败 e、 g 现在,如果tags为None,那么下面的列表理解将失败。如果标记为空/[],则可以正常工作。我想要一份对照无的清单Python 如何检查对象是否不在列表中?,python,list-comprehension,Python,List Comprehension,我对Python中的列表理解有些熟悉。但是当我需要检查列表是否为“无”时,列表理解就会失败 e、 g 现在,如果tags为None,那么下面的列表理解将失败。如果标记为空/[],则可以正常工作。我想要一份对照无的清单 [k for k,v in tags if tags]: 您可以在此处使用三元条件: ([k for k, v in tags] if tags is not None else []) 您也可以在理解中嵌入三元条件: [k for k, v in (tags if tags
[k for k,v in tags if tags]:
您可以在此处使用三元条件:
([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代表k,v在标记if-tags]
的行为并不像您预期的那样。
列表理解的if
子句在每次迭代时都会进行评估,这意味着为列表中的每个元素检查标记的真值
为了证明这一点:
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中是一个三元条件。您可以使用前面的if块进行测试
if tags is not None:
...
或与空iterable短路:
>>> tags = None
>>> [k for k, _ in tags or ()]
[]
这个怎么样:
[k for k in (tags or [])]
让我们看看这两种情况会发生什么:
>>标记=无
>>> [k for k in (tags or [])]
[]
tags=[1,2,3]
>>> [k for k in (tags or [])]
[1, 2, 3]
之所以这样做是因为(tags或[])
仅当bool(tags)==True时才会返回tags
。否则,它将返回第二个参数,在本例中为[]
,即使其布尔值也是False
。通过这种方式,我们要么在标记上循环,如果它存在,要么在空列表上循环,如果它不存在。您正在尝试在标记上循环。。您可以使用空收集器([]
,()
,{}
)来完成此操作,但不能超过无
。为什么需要列表理解。最短路径:[k代表k,v代表(标记或[])]
太棒了!一种干净的解决方案,避免使用if语句检查对象是否为None。
>>> [k for k in (tags or [])]
[1, 2, 3]