web-dev-qa-db-fra.com

Renvoi d'un booléen si l'ensemble est vide

Je lutte pour trouver un moyen plus propre de retourner une valeur booléenne si mon ensemble est vide à la fin de ma fonction.

Je prends l'intersection de deux ensembles et je veux renvoyer True ou False en fonction du fait que l'ensemble résultant est vide.

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

Ma pensée initiale était de faire

return c is not None

Cependant, dans mon interprète, je peux facilement voir que cette déclaration retournera true si c = set([])

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

J'ai également essayé toutes les solutions suivantes:

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

J'ai lu dans la documentation que je ne peux utiliser que and, or et not avec des ensembles vides pour en déduire une valeur booléenne. Jusqu'ici, la seule chose que je peux trouver est de revenir non pas non

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

J'ai le sentiment qu'il existe une façon beaucoup plus pythonique de le faire, mais j'ai du mal à le trouver. Je ne veux pas renvoyer l'ensemble réel à une instruction if car je n'ai pas besoin des valeurs, je veux juste savoir si elles se croisent.

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

bool() fera quelque chose de similaire à not not, mais plus idéomatique et clair.

29
Jonas Schäfer

pas aussi pythonique que les autres réponses, mais mathématiques: 

return len(c) == 0
53
gefei

Si vous voulez return True pour un ensemble vide, alors je pense qu'il serait plus clair de le faire:

return c == set()

i.e. "c est égal à un set vide". 

(Ou, dans l’inverse, return c != set()).

À mon avis, cela est plus explicite (bien que moins idiomatique) que de compter sur l'interprétation par Python d'un ensemble vide en tant que False dans un contexte booléen.

13
jonrsharpe

Si c est un ensemble, vous pouvez vérifier s'il est vide en faisant: return not c.

Si c est vide, alors not c sera True.

Sinon, si c contient des éléments, not c sera False.

11
Simeon Visser

Quand tu dis:

c is not None

Vous êtes en train de vérifier si c et None font référence au même objet. C'est ce que fait l'opérateur "est". En python, None est une valeur null spéciale, ce qui signifie que vous n'avez pas de valeur disponible. Sorta comme null en c ou Java. Étant donné que python n'attribue en interne qu'une valeur Aucune à l'aide de l'opérateur "est", il vérifie si quelque chose fonctionne (pensez) et qu'il est devenu le style populaire Cependant, cela n'a pas à voir avec la valeur de vérité de l'ensemble c, il vérifie que c est réellement un ensemble plutôt qu'une valeur nulle.

Si vous voulez vérifier si un ensemble est vide dans une instruction conditionnelle, il est converti en booléen dans le contexte afin que vous puissiez simplement dire:

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

Mais si vous voulez que le fichier converti en booléen soit stocké, vous pouvez simplement dire:

c = set()
c_has_stuff_in_it = bool(c)
2
Andrew Allaire

Pas aussi propre que bool (c) mais c’était une excuse pour utiliser ternary.

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

Également en utilisant un peu de la même logique, il n'est pas nécessaire d'affecter à c, sauf si vous l'utilisez pour autre chose.

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

Enfin, je suppose que vous voulez une valeur True/False car vous allez effectuer une sorte de test booléen avec cette valeur. Je recommanderais d'éviter les frais généraux liés à un appel de fonction et à une définition en testant simplement où vous en avez besoin.

Au lieu de:

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

Peut être ça:

if a.intersection(b):
    # Do something
0
Amos Baker
"""
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()
0
shtut shtuzim