如果set为空,则返回布尔值

时间:2014-01-17 16:45:13

标签: python python-2.7

如果我的函数在函数结束时为空,我很难找到更简洁的返回布尔值的方法

我选择了两组的交集,并希望根据结果集是否为空来返回TrueFalse

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

我最初的想法是

return c is not None

但是,在我的翻译中,我很容易看到如果c = set([])

,该语句将返回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

我觉得有更多的pythonic方法可以做到这一点,我很难找到它。我不想将实际的设置返回到if语句,因为我不需要这些值,我只是想知道它们是否相交。

7 个答案:

答案 0 :(得分:59)

不像其他答案那样是pythonic,而是数学:

return len(c) == 0

答案 1 :(得分:31)

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

bool()会执行类似于not not的操作,但会更加理想和清晰。

答案 2 :(得分:14)

如果你想return True为空集,那么我认为这样做会更清楚:

return c == set()

即。 “c等于空set”。

(或者,相反,return c != set())。

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

答案 3 :(得分:11)

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

如果c为空,则not c将为True

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

答案 4 :(得分:3)

当你说:

c is not None

您实际上正在检查c和None是否引用相同的对象。这就是“是”运营商所做的事情。在python中,None是一个特殊的空值,通常意味着您没有可用的值。在c或java中排序为null。因为python内部只使用“is”运算符分配一个None值来检查某些东西是否为None(想想为null),并且它已经成为流行的样式。然而,这与集合c的真值无关,它检查c实际上是一个集合而不是空值。

如果要在条件语句中检查集合是否为空,则在上下文中将其转换为布尔值,这样您就可以说:

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

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

c = set()
c_has_stuff_in_it = bool(c)

答案 5 :(得分:0)

不像bool(c)那样干净,但它是使用三元的借口。

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

同样使用一些相同的逻辑,除非你将它用于别的东西,否则不需要分配给它。

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

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

而不是:

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

也许这个:

if a.intersection(b):
    # Do something

答案 6 :(得分:0)

"""
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()