¿Cómo comprobar si un diccionario está vacío?

Resuelto Unsparing asked hace 10 años • 8 respuestas

Estoy intentando comprobar si un diccionario está vacío pero no se comporta correctamente. Simplemente lo omite y muestra EN LÍNEA sin nada más que mostrar el mensaje. ¿Alguna idea de por qué?

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()))    
Unsparing avatar Apr 20 '14 08:04 Unsparing
Aceptado

Los diccionarios vacíos se evalúanFalse en Python:

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

Por tanto, su isEmptyfunción es innecesaria. Todo lo que necesitas hacer es:

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()))
 avatar Apr 20 '2014 01:04

Aquí hay tres formas de verificar si el dict está vacío. Aunque prefiero usar solo la primera forma. Las otras dos formas son demasiado prolijas.

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"
doubleo avatar Apr 20 '2014 04:04 doubleo
d = {}
print(len(d.keys()))

Si la longitud es cero, significa que el dict está vacío.

Achilles Ram Nakirekanti avatar Dec 16 '2016 10:12 Achilles Ram Nakirekanti

A continuación se muestran formas sencillas de comprobar un dictado vacío:

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

El método 1 es más estricto porque cuando a = None, el método 1 proporcionará el resultado correcto, pero el método 2 dará un resultado incorrecto.

Shagun Pruthi avatar Dec 11 '2018 10:12 Shagun Pruthi

Un diccionario se puede convertir automáticamente a booleano, lo que se evalúa Falsecomo diccionario vacío y Truediccionario no vacío.

if myDictionary: non_empty_clause()
else: empty_clause()

Si esto parece demasiado idiomático, también puedes probar len(myDictionary)cero, o set(myDictionary.keys())un conjunto vacío, o simplemente probar la igualdad con {}.

La función isEmpty no solo es innecesaria sino que además su implementación tiene múltiples problemas que puedo detectar prima-facie.

  1. La return Falsedeclaración tiene una sangría demasiado profunda. Debe estar fuera del bucle for y al mismo nivel que la fordeclaración. Como resultado, su código procesará solo una clave seleccionada arbitrariamente, si existe una clave. Si una clave no existe, la función devolverá None, que se convertirá en booleano Falso. ¡Ay! Todos los diccionarios vacíos se clasificarán como falsos negativos.
  2. Si el diccionario no está vacío, entonces el código procesará solo una clave y devolverá su valor convertido a booleano. Ni siquiera puedes asumir que se evalúa la misma clave cada vez que la llamas. Entonces habrá falsos positivos.
  3. Digamos que corrige la sangría de la return Falsedeclaración y la saca del forbucle. Entonces lo que obtienes es el OR booleano de todas las claves, o Falsesi el diccionario está vacío. Aún así tendrás falsos positivos y falsos negativos. Haga la corrección y compruébela con el siguiente diccionario para obtener evidencia.

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

Della avatar Jan 14 '2019 10:01 Della