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

C.B*_*.B. 62 python python-2.7

如果我的函数在函数结束时为空,我正在努力寻找一种更简洁的返回布尔值的方法

我取两组的交集,并希望返回TrueFalse基于结果集是否为空.

def myfunc(a,b):
    c = a.intersection(b)
    #...return boolean here
Run Code Online (Sandbox Code Playgroud)

我最初的想法是做

return c is not None
Run Code Online (Sandbox Code Playgroud)

但是,在我的翻译中,我可以很容易地看到该语句将返回true c = set([])

>>> c = set([])
>>> c is not None
True
Run Code Online (Sandbox Code Playgroud)

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

>>> c == None
False
>>> c == False
False
>>> c is None
False
Run Code Online (Sandbox Code Playgroud)

现在,我已经从我只能用文档阅读and,or以及not与空集来推断一个布尔值.到目前为止,我唯一能想到的就是回归而不是c

>>> not not c
False
>>> not c
True
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,有更多的pythonic方式来做到这一点,我正在努力找到它.我不想将实际的设置返回到if语句,因为我不需要值,我只想知道它们是否相交.

gef*_*fei 72

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

return len(c) == 0
Run Code Online (Sandbox Code Playgroud)

  • 我认为这实际上更好.它使您的意图更清晰. (7认同)
  • 我担心即使`c`非常大,也必须计算`len(c)`,这对于检查空虚是不必要的. (4认同)
  • ^ +1 @CB我对len(c)进行了一些测试,它肯定是一个代表len的变量,因为当设置大小改变了戏剧性的数量级时,运行时差异可以忽略不计. (2认同)

Jon*_*fer 44

def myfunc(a,b):
    c = a.intersection(b)
    return bool(c)
Run Code Online (Sandbox Code Playgroud)

bool()会做类似的事情not not,但更具思想性和清晰性.

  • 我反对,当你问“is_empty”时写“bool(...)”是晦涩难懂的。我不表达意图。 (9认同)
  • @tamas.kenez 不过,你必须承认,它比“不是不是”更清楚;)。(FTR:我已经对@gefeis的答案投了赞成票,但我对OP接受的事情没有影响力……) (2认同)

jon*_*rpe 18

如果你想要return True一个空集,那么我认为它会更清楚:

return c == set()
Run Code Online (Sandbox Code Playgroud)

即" c等于空set".

(或者,换句话说,return c != set()).

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

  • 实际上,依靠Python的解释是非常可以接受的做法.只要记住它的局限性. (2认同)

Sim*_*ser 13

如果c是一个集合,那么你可以通过以下方式检查它是否为空:return not c.

如果c是空的那么not c将是True.

否则,如果c包含任何元素not cFalse.


And*_*ire 8

当你说:

c is not None
Run Code Online (Sandbox Code Playgroud)

您实际上是在检查 c 和 None 是否引用同一个对象。这就是“is”运算符所做的。在 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"
Run Code Online (Sandbox Code Playgroud)

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

c = set()
c_has_stuff_in_it = bool(c)
Run Code Online (Sandbox Code Playgroud)