Devolver booleano si set está vacío


Estoy luchando para encontrar una forma más limpia de devolver un valor booleano si mi conjunto está vacío al final de mi función

Tomo la intersección de dos conjuntos, y quiero devolver True o False basado en si el conjunto resultante está vacío.

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

Mi pensamiento inicial fue hacer

return c is not None

Sin embargo, en mi intérprete puedo ver fácilmente que la declaración volverá verdadera si c = set([])

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

También he probado todo lo siguiente:

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

Ahora he leído de la documentación que solo puedo usar and, or, y not con conjuntos vacíos para deducir un valor booleano. Hasta ahora, lo único que se me ocurre es regresar no no c

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

Tengo la sensación de que hay una forma mucho más pitónica de hacer esto, por lo que estoy luchando para encontrarlo. No quiero devolver el conjunto real a una sentencia if porque no necesito los valores, solo quiero saber si se cruzan.

Author: Roman C, 2014-01-17

6 answers

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

bool() hará algo similar a not not, pero más ideomático y claro.

 24
Author: Jonas Schäfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-17 16:46:32

No tan pitónico como las otras respuestas, pero matemáticas:

return len(c) == 0
 42
Author: gefei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-17 16:48:02

Si quieres return True para un conjunto vacío, entonces creo que sería más claro hacerlo:

return c == set()

Es decir,"c es igual a un set vacío".

(O, al revés, return c != set()).

En mi opinión, esto es más explícito (aunque menos idiomático) que confiar en la interpretación de Python de un conjunto vacío como False en un contexto booleano.

 11
Author: jonrsharpe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-17 16:47:49

Si c es un conjunto, puede comprobar si está vacío haciendo: return not c.

Si c está vacío entonces not c será True.

De lo contrario, si c contiene cualquier elemento not c será False.

 9
Author: Simeon Visser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-17 16:46:53

Cuando dices:

c is not None

En realidad está comprobando si c y None hacen referencia al mismo objeto. Eso es lo que hace el operador" es". En python None es un valor null especial que convencionalmente significa que no tiene un valor disponible. Sorta como null en c o java. Dado que python internamente solo asigna un valor None usando el operador " is " para verificar si algo es None (piense en null) funciona, y se ha convertido en el estilo popular. Sin embargo, esto no tiene que ver con el valor de verdad del conjunto c, está comprobando que c realmente es un conjunto en lugar de un valor nulo.

Si desea verificar si un conjunto está vacío en una instrucción condicional, se castea como un booleano en contexto, por lo que solo puede decir:

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

Pero si quieres que se convierta a un booleano para ser almacenado, simplemente puedes decir:

c = set()
c_has_stuff_in_it = bool(c)
 2
Author: Andrew Allaire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-14 20:49:08

No tan limpio como bool(c) pero era una excusa para usar ternary.

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

También usando un poco de la misma lógica no hay necesidad de asignar a c a menos que lo esté usando para otra cosa.

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

Finalmente, asumiría que desea un valor Verdadero / Falso porque va a realizar algún tipo de prueba booleana con él. Recomendaría saltarse la sobrecarga de una llamada y definición de función simplemente probando donde la necesita.

En lugar de:

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

Tal vez esto:

if a.intersection(b):
    # Do something
 0
Author: Amos Baker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-30 16:56:29