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

6 minutos de lectura

Avatar de usuario de Unsparing
Despiadado

Estoy tratando de verificar 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()))    

  • para comprobar si self.users no está vacío, solo hazlo if self.users.

    – BrenBarn

    20 de abril de 2014 a las 1:31

  • Su isEmpty en realidad regresa True si la primera clave proporcionada por el diccionario es verdadera y devuelve False de lo contrario. Si el diccionario está vacío, devuelve None lo cual no es == False.

    – Hiperbóreo

    20 de abril de 2014 a las 2:08


  • Su declaración if está al revés.

    – Físico loco

    21 de abril de 2015 a las 3:55

  • tenga cuidado con las claves falsas stackoverflow.com/a/17347421/1379762

    – Wajih

    06/02/2016 a las 19:20

  • Posible duplicado de Python: forma eficiente de verificar si el diccionario está vacío o no

    – triplete

    21 de abril de 2016 a las 6:12

Diccionarios vacios evaluar a False en Python:

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

Por lo tanto, su isEmpty la funció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()))

  • @Wajih tu enlace es irrelevante: bool({False: False})todavía se evalúa a True. El enlace que diste corresponde a anymétodo, que depende de las claves.

    – Ulises BN

    17 de febrero de 2017 a las 20:38

  • @Wajih, ¿qué significa eso?

    –Charlie Parker

    12/09/2017 a las 18:37

  • Siento que ‘no dict’ no es explícito

    – soy Batman

    9 de enero de 2019 a las 13:03

  • de acuerdo, tengo ganas de usar los booleanos y not <dict> no esta tan claro tambien

    – cyanbhu

    28 de mayo de 2019 a las 2:07

  • “su función isEmpty es innecesaria” Hace que el código sea más fácil de entender aunque.

    – GG.

    23 de marzo de 2021 a las 21:21


Aquí hay tres formas en que puede verificar si dict está vacío. Sin embargo, prefiero usar la primera forma solamente. 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"

  • Suspiro … a todos les gusta ser “pitónicos” y buscan la menor cantidad de caracteres para escribir. En primer lugar, otro criterio es la legibilidad. En segundo lugar, la primera prueba en la respuesta anterior es verdadera no solo si el dict existe y está vacío, sino también si test_dict es None. Por lo tanto, use esta prueba solo cuando sepa que el objeto dict existe (o cuando la diferencia no importe). La segunda forma también tiene ese comportamiento. Solo la tercera vía ladra si test_dict es Ninguno.

    – Andreas Maier

    12 dic 2016 a las 19:37


  • @AndreasMaier Exactamente lo que siento también. Además, python se escribe dinámicamente. Dentro de una función, es común verificar “si x es un diccionario no vacío, entonces haga esto; si x es una matriz numpy no vacía, entonces haga eso”. Entonces el primer código fallará en if x cuando x es una matriz numpy

    – jf328

    15 de diciembre de 2016 a las 8:36


  • @Wajih, tu enlace sigue siendo irrelevante aquí… Mira por qué

    – Ulises BN

    17 de febrero de 2017 a las 20:44

  • No votar esto aunque técnicamente correcto debido a las preocupaciones que comparto. @AndreasMaier

    – aturdidor

    17 dic 2018 a las 23:36

Avatar de usuario de Achilles Ram Nakirekanti
Aquiles Carnero Nakirekanti

d = {}
print(len(d.keys()))

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

  • Si bien este fragmento de código puede resolver la pregunta, incluyendo una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código.

    – Dima San

    16 de diciembre de 2016 a las 11:43

  • len(dict.keys()) es equivalente a len(dict)

    – pdpAxis

    04/06/2020 a las 18:45


  • @pdpAxis En el valor que da, aunque apuesto a la implementación de dict.__len__ es probablemente un poco más rápido. 🙂

    –Mateen Ulhaq

    11 de junio de 2020 a las 2:21

Avatar de usuario de Shagun Pruthi
Shagun Pruti

Las formas simples de verificar un dictado vacío están a continuación:

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 = Noneel método 1 proporcionará el resultado correcto, pero el método 2 dará un resultado incorrecto.

Avatar de usuario de Della
della

Un diccionario se puede convertir automáticamente a booleano, lo que se evalúa como False para diccionario vacío y True para diccionario no vacío.

if myDictionary: non_empty_clause()
else: empty_clause()

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

La función isEmpty no solo es innecesaria, sino que también su implementación tiene múltiples problemas que puedo detectar a primera vista.

  1. Él return False La instrucción tiene una sangría de un nivel demasiado profunda. Debe estar fuera del bucle for y al mismo nivel que el for declaración. Como resultado, su código procesará solo una clave seleccionada arbitrariamente, si existe una clave. Si una clave no existe, la función volverá None, que se convertirá en booleano False. ¡Ay! Todos los diccionarios vacíos se clasificarán como falsos negativos.
  2. Si el diccionario no está vacío, el código procesará solo una clave y devolverá su valor convertido a booleano. Ni siquiera puede suponer que se evalúa la misma clave cada vez que la llama. Entonces habrá falsos positivos.
  3. Digamos que usted corrige la sangría del return False declaración y tráigala fuera del for círculo. Entonces lo que obtienes es el valor booleano O de todas las llaves, o False si el diccionario está vacío. Aún así tendrás falsos positivos y falsos negativos. Haz la corrección y prueba contra el siguiente diccionario para una evidencia.

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

Avatar de usuario de Gino Mempin
Gino Mempín

1er Camino

len(given_dic_obj) 

Devuelve 0 si no hay elementos. De lo contrario, devuelve el tamaño del diccionario.

2do Camino

bool(given_dic_object)

Devoluciones False si el diccionario está vacío, de lo contrario devuelve True.

Avatar de usuario de MortenB
MortenB

También puede usar get(). Inicialmente, creía que solo verificaba si existía una clave.

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

Lo que me gusta de get es que no desencadena una excepción, por lo que facilita atravesar estructuras grandes.

¿Ha sido útil esta solución?