Python: Controllare se un 'Dizionario' è vuoto non sembra funzionare


396

Sto cercando di verificare se un dizionario è vuoto ma non si comporta correttamente. Lo salta e visualizza ONLINE senza nulla tranne che per visualizzare il messaggio. Qualche idea sul perché?

 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())) 

6
Per verificare se self.usersè vuoto, basta farlo if self.users.
BrenBarn,

4
Il tuo isEmptyeffettivamente ritorna Truese la prima chiave prodotta dal dizionario è truey e restituisce Falsealtrimenti. Se il dizionario è vuoto, restituisce ciò Noneche non lo è == False.
Iperboro,

La tua dichiarazione if è al contrario.
Fisico pazzo,

fai attenzione alle chiavi false come stackoverflow.com/a/17347421/1379762
Wajih

Risposte:


737

I dizionari vuoti valutanoFalse in Python:

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

Pertanto, la tua isEmptyfunzione non è necessaria. Tutto quello che devi fare è:

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()))

7
@Wajih il tuo link è irrilevante: bool({False: False})valuta ancora True. Il link che hai fornito corrisponde al anymetodo, che dipende dalle chiavi.
Ulysse BN,

@Wajih cosa significa?
Charlie Parker,

2
Sento che "non dettare" non è esplicito
imbatman

d'accordo, ho voglia di usare i booleani e not <dict>non è poi così chiaro
cryanbhu,

130

Ecco tre modi per verificare se dict è vuoto. Preferisco usare il primo modo solo però. Gli altri due modi sono troppo prolissi.

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"

44
Sigh ... a tutti piace essere "pitonici" e cerca di scrivere solo i personaggi meno cari. Innanzitutto, un altro criterio è la leggibilità. In secondo luogo, il primo test nella risposta sopra è vero non solo se il dict esiste ed è vuoto, ma anche se test_dict è None. Quindi usa questo test solo quando sai che esiste l'oggetto dict (o quando la differenza non ha importanza). Il secondo modo ha anche quel comportamento. Solo il terzo modo abbaia se test_dict è Nessuno.
Andreas Maier,

1
@AndreasMaier Esattamente anche il mio sentimento. Inoltre, python viene digitato in modo dinamico. All'interno di una funzione è comune verificare "se x è un dizionario non vuoto, quindi fare questo; se x è un array numpy non vuoto, allora farlo". Quindi il primo codice non funzionerà if xquando x è matrice
numpy

1
@Wajih il link è ancora irrilevante qui ... Vedi perché
Ulysse BN,

1
Non sottovalutare questo, sebbene tecnicamente corretto a causa delle preoccupazioni con cui condivido. @AndreasMaier
Stunner

16
dict = {}
print(len(dict.keys()))

se la lunghezza è zero significa che dict è vuoto


3
Mentre questo frammento di codice può risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
DimaSan,

1
len(dict.keys())è equivalente alen(dict)
pdpAxis il

@pdpAxis Nel valore che dà, anche se scommetto che l'implementazione di dict.__len__è probabilmente un po 'più veloce. :)
Mateen Ulhaq,

6

Di seguito sono riportati modi semplici per controllare un dict vuoto:

        a= {}

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

Sebbene il metodo 1 sia più rigoroso di quando a = Nessuno, il metodo 1 fornirà il risultato corretto ma il metodo 2 darà un risultato errato.


1

Un dizionario può essere automaticamente convertito in booleano, che valuta Falseper dizionario vuoto e dizionario Truenon vuoto.

if myDictionary: non_empty_clause()
else: empty_clause()

Se questo sembra troppo idiomatico, puoi anche testare lo len(myDictionary)zero, o set(myDictionary.keys())per un set vuoto, o semplicemente testare l'uguaglianza con {}.

La funzione isEmpty non è solo superflua, ma anche la tua implementazione ha molteplici problemi che posso individuare prima facie.

  1. La return Falsefrase è rientrata di un livello troppo profondo. Dovrebbe essere al di fuori del ciclo for e allo stesso livello fordell'istruzione. Di conseguenza, il codice elaborerà solo una chiave, selezionata arbitrariamente, se esiste una chiave. Se non esiste una chiave, la funzione tornerà None, che verrà lanciata su false booleane. Ahia! Tutti i dizionari vuoti saranno classificati come falsi nagativi.
  2. Se il dizionario non è vuoto, il codice elaborerà solo una chiave e restituirà il suo valore cast a booleano. Non puoi nemmeno supporre che lo stesso tasto venga valutato ogni volta che lo chiami. Quindi ci saranno falsi positivi.
  3. Diciamo che correggi il rientro dell'istruzione return Falsee portalo fuori dal forciclo. Quindi quello che ottieni è il booleano OR di tutte le chiavi, o Falsese il dizionario è vuoto. Avrai comunque falsi positivi e falsi negativi. Esegui la correzione e verifica il seguente dizionario per una prova.

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


-1

Puoi anche usare get (). Inizialmente ho creduto di controllare solo se esistesse la chiave.

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

Quello che mi piace di get è che non fa scattare un'eccezione, quindi rende facile attraversare grandi strutture.


-4

Perché non usare il test di uguaglianza?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")

Sembra un errore di sintassi e non mostra come applicare il controllo nel contesto della domanda.
Roland Weber,

-7

usa 'qualsiasi'

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anycontrolla se il dict contiene qualche chiave di verità, ad es. any({0: 'something'})ritorna Falseanche se il dict non è vuoto
Railslide

sì, per salvare da entrambi i casi, veritiero e vuoto, un altro saggio bool avrebbe dato la verità per il caso veritiero. se pensi a scopi di codifica generale.
Chhotu Sardard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.