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.
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.
pas aussi pythonique que les autres réponses, mais mathématiques:
return len(c) == 0
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.
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
.
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)
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
"""
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()