如果 set 为空则返回 boolean

我正在努力寻找一种更干净的方式来返回一个布尔值,如果我的集合在函数结束时是空的

我取两个集合的交集,并希望根据结果集是否为空来返回 TrueFalse

def myfunc(a,b):
c = a.intersection(b)
#...return boolean here

我最初的想法是

return c is not None

但是,在我的解释器中,我可以很容易地看到,如果 c = set([])返回 true,那么该语句将返回 true

>>> c = set([])
>>> c is not None
True

我还尝试了以下所有方法:

>>> c == None
False
>>> c == False
False
>>> c is None
False

现在我已经从文档中读到,我只能使用带有空集的 andornot来推断布尔值。到目前为止,我唯一能想到的就是返回而不是 c

>>> not not c
False
>>> not c
True

我有一种感觉,有一个更蟒蛇的方式来做到这一点,由我正在努力寻找它。我不想将实际的集合返回到 if 语句,因为我不需要这些值,我只想知道它们是否相交。

165722 次浏览
def myfunc(a,b):
c = a.intersection(b)
return bool(c)

bool() 将做一些类似于 not not的事情,但是更加直观和清晰。

如果 c是一个集合,那么您可以通过执行以下操作来检查它是否为空: return not c

If c is empty then not c will be True.

否则,如果 c包含任何元素,则 not c将是 False

如果你想让 return True成为一个空的集合,那么我认为这样做会更清楚:

return c == set()

即“ c等于一个空的 set”。

(或者,反过来说,return c != set())。

在我看来,这比依赖 Python 在布尔上下文中将空集解释为 False更加明确(尽管不那么惯用)。

不像其他答案那么简单,而是数学:

return len(c) == 0

由于一些评论想知道 len(set)对复杂性的影响。它是 O (1) ,如 源代码所示,因为它依赖于一个跟踪集合使用情况的变量。

static Py_ssize_t
set_len(PyObject *so)
{
return ((PySetObject *)so)->used;
}

当你说:

c is not None

您实际上是在检查 c 和 Nothing 是否引用同一个对象。这就是“ is”运算符的作用。在 python 中,Nothing 是一个特殊的 null 值,这通常意味着您没有可用的值。有点像 c 或 java 中的 null。因为 python 内部只分配一个 Nothing 值,使用“ is”操作符检查某个值是否为 Nothing (认为 null) ,所以它已经成为流行的样式。然而,这与集合 c 的真值无关,它检查的是 c 实际上是一个集合而不是一个空值。

如果你想检查一个集合在 If判断语句中是否是空的,它会在上下文中被强制转换为布尔值,这样你就可以说:

c = set()
if c:
print "it has stuff in it"
else:
print "it is empty"

但是如果你想把它转换成一个布尔值存储起来,你可以简单地说:

c = set()
c_has_stuff_in_it = bool(c)

Not as clean as bool(c) but it was an excuse to use ternary.

def myfunc(a,b):
return True if a.intersection(b) else False

另外,使用一点相同的逻辑,就不需要赋值给 c,除非您将它用于其他用途。

def myfunc(a,b):
return bool(a.intersection(b))

最后,我假设您需要一个 True/False 值,因为您将用它执行某种布尔测试。我建议跳过函数调用和定义的开销,简单地测试您需要它的地方。

而不是:

if (myfunc(a,b)):
# Do something

也许是这样:

if a.intersection(b):
# Do something
"""
This function check if set is empty or not.
>>> c = set([])
>>> set_is_empty(c)
True


:param some_set: set to check if he empty or not.
:return True if empty, False otherwise.
"""
def set_is_empty(some_set):
return some_set == set()