¿Cómo comprobar si un diccionario está vacío?
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()))
Los diccionarios vacíos se evalúanFalse
en Python:
>>> dct = {}
>>> bool(dct)
False
>>> not dct
True
>>>
Por tanto, su isEmpty
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()))
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"
d = {}
print(len(d.keys()))
Si la longitud es cero, significa que el dict está vacío.
A continuación se muestran formas sencillas de comprobar un dictado vacío:
a = {}
-
if a == {}: print ('empty dict')
-
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.
Un diccionario se puede convertir automáticamente a booleano, lo que se evalúa False
como diccionario vacío y True
diccionario 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.
- La
return False
declaración tiene una sangría demasiado profunda. Debe estar fuera del bucle for y al mismo nivel que lafor
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 devolveráNone
, que se convertirá en booleano Falso. ¡Ay! Todos los diccionarios vacíos se clasificarán como falsos negativos. - 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.
- Digamos que corrige la sangría de la
return False
declaración y la saca delfor
bucle. Entonces lo que obtienes es el OR booleano de todas las claves, oFalse
si 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'}