Python 如何检查对象是否不在列表中?

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

我对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 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]