Python: vérifier si un «dictionnaire» est vide ne semble pas fonctionner

397

J'essaie de vérifier si un dictionnaire est vide mais il ne se comporte pas correctement. Il saute simplement et affiche EN LIGNE sans rien, sauf d'afficher le message. Des idées pourquoi?

 def isEmpty(self, dictionary):
   for element in dictionary:
     if element:
       return True
     return False

 def onMessage(self, socket, message):
  if self.isEmpty(self.users) == False:
     socket.send("Nobody is online, please use REGISTER command" \
                 " in order to register into the server")
  else:
     socket.send("ONLINE " + ' ' .join(self.users.keys())) 
Prodigue
la source
6
Pour vérifier s'il self.usersn'est pas vide, faites-le if self.users.
BrenBarn
4
Votre isEmptyretourne réellement Truesi la première clé fournie par le dictionnaire est vraie et renvoie le Falsecontraire. Si le dictionnaire est vide, il renvoie Nonece qui ne l'est pas == False.
Hyperboreus
Votre instruction if est à l'envers.
Mad Physicist
attention aux fausses clés stackoverflow.com/a/17347421/1379762
Wajih

Réponses:

738

Les dictionnaires vides sont évaluésFalse en Python:

>>> dct = {}
>>> bool(dct)
False
>>> not dct
True
>>>

Ainsi, votre isEmptyfonction n'est pas nécessaire. Il vous suffit de:

def onMessage(self, socket, message):
    if not self.users:
        socket.send("Nobody is online, please use REGISTER command" \
                    " in order to register into the server")
    else:
        socket.send("ONLINE " + ' ' .join(self.users.keys()))

la source
7
@Wajih que vous liez n'est pas pertinent: est bool({False: False})toujours évalué True. Le lien que vous avez donné correspond à la anyméthode, qui dépend des clés.
Ulysse BN
@Wajih qu'est-ce que cela signifie?
Charlie Parker
2
Je pense que «pas dict» n'est pas explicite
imbatman
d'accord, j'ai envie d'utiliser les booléens et ce not <dict>n'est pas si clair aussi
cryanbhu
130

Voici trois façons de vérifier si le dict est vide. Je préfère cependant utiliser la première façon. Les deux autres façons sont beaucoup trop verbeuses.

test_dict = {}

if not test_dict:
    print "Dict is Empty"


if not bool(test_dict):
    print "Dict is Empty"


if len(test_dict) == 0:
    print "Dict is Empty"
double
la source
44
Soupir ... tout le monde aime être "pythonique" et va pour le moins de caractères à taper. Premièrement, un autre critère est la lisibilité. Deuxièmement, le premier test dans la réponse ci-dessus est vrai non seulement si le dict existe et est vide, mais aussi si test_dict vaut None. N'utilisez donc ce test que lorsque vous savez que l'objet dict existe (ou lorsque la différence n'a pas d'importance). La deuxième façon a également ce comportement. Seule la troisième voie aboie si test_dict est None.
Andreas Maier
1
@AndreasMaier Exactement mon sentiment aussi. De plus, python est typé dynamiquement. Dans une fonction, il est courant de vérifier "si x est un dictionnaire non vide, alors faites ceci; si x est un tableau numpy non vide, alors faites cela". Ensuite, le premier code échouera if xlorsque x est un tableau
numpy
1
@Wajih que vous liez n'est toujours pas pertinent ici ... Voir pourquoi
Ulysse BN
1
Pas de vote positif bien que techniquement correct en raison des préoccupations que je partage. @AndreasMaier
Stunner
16
dict = {}
print(len(dict.keys()))

si la longueur est nulle signifie que dict est vide

Achilles Ram Nakirekanti
la source
3
Bien que cet extrait de code puisse résoudre la question, y compris une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondrez à la question pour les lecteurs à l'avenir, et ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
DimaSan
1
len(dict.keys())équivaut àlen(dict)
pdpAxis
@pdpAxis Dans la valeur qu'il donne, bien que je parie que la mise en œuvre de dict.__len__est probablement un peu plus rapide. :)
Mateen Ulhaq
6

Voici des moyens simples de vérifier un dict vide:

        a= {}

    1. if a == {}:
           print ('empty dict')
    2. if not a:
           print ('empty dict')

Bien que la méthode 1 soit plus stricte que lorsque a = None, la méthode 1 fournira un résultat correct mais la méthode 2 donnera un résultat incorrect.

Shagun Pruthi
la source
1

Un dictionnaire peut être automatiquement converti en booléen qui évalue Falsepour un dictionnaire vide et Truepour un dictionnaire non vide.

if myDictionary: non_empty_clause()
else: empty_clause()

Si cela semble trop idiomatique, vous pouvez également tester len(myDictionary)pour zéro, ou set(myDictionary.keys())pour un ensemble vide, ou simplement tester l'égalité avec {}.

La fonction isEmpty n'est pas seulement inutile, mais votre implémentation a également plusieurs problèmes que je peux repérer à première vue.

  1. La return Falsedéclaration est en retrait d'un niveau trop profond. Elle doit être en dehors de la boucle for et au même niveau que l' forinstruction. Par conséquent, votre code ne traitera qu'une seule clé sélectionnée arbitrairement, si une clé existe. Si une clé n'existe pas, la fonction retournera None, qui sera convertie en booléen False. Aie! Tous les dictionnaires vides seront classés comme faux-nagatifs.
  2. Si le dictionnaire n'est pas vide, le code ne traitera qu'une seule clé et renverra sa valeur en booléen. Vous ne pouvez même pas supposer que la même clé est évaluée chaque fois que vous l'appelez. Il y aura donc des faux positifs.
  3. Disons que vous corrigez l'indentation de la return Falsedéclaration et la forsortez de la boucle. Ensuite, ce que vous obtenez est le booléen OU de toutes les clés, ou Falsesi le dictionnaire est vide. Vous aurez toujours de faux positifs et de faux négatifs. Effectuez la correction et testez le dictionnaire suivant pour obtenir des preuves.

myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}

Della
la source
-1

Vous pouvez également utiliser get (). Au début, je pensais qu'il ne vérifiait que si la clé existait.

>>> d = { 'a':1, 'b':2, 'c':{}}
>>> bool(d.get('c'))
False
>>> d['c']['e']=1
>>> bool(d.get('c'))
True

Ce que j'aime avec get, c'est qu'il ne déclenche pas d'exception, donc il est facile de parcourir de grandes structures.

MortenB
la source
-4

Pourquoi ne pas utiliser le test d'égalité?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")
wieczorek1990
la source
Cela ressemble à une erreur de syntaxe et ne montre pas comment appliquer la vérification dans le contexte de la question.
Roland Weber
-7

utilisez «tout»

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty
chhotu sardar
la source
4
anyvérifie si le dict contient une clé véridique, par exemple any({0: 'something'})retourne Falsemême si le dict n'est pas vide
Railslide
oui que pour sauver des deux cas, véridiques et vierges, d'autres booléens sages auraient donné la vérité pour le cas véridique. si vous pensez à des fins de codage général.
chhotu sardar