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()))
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 aTrue
. El enlace que diste corresponde aany
mé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
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 alen(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
Shagun Pruti
Las formas simples de verificar un dictado vacío están a continuación:
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.
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.
- É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 elfor
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. - 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.
- Digamos que usted corrige la sangría del
return False
declaración y tráigala fuera delfor
círculo. Entonces lo que obtienes es el valor booleano O de todas las llaves, oFalse
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'}
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.
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.
para comprobar si
self.users
no está vacío, solo hazloif self.users
.– BrenBarn
20 de abril de 2014 a las 1:31
Su
isEmpty
en realidad regresaTrue
si la primera clave proporcionada por el diccionario es verdadera y devuelveFalse
de lo contrario. Si el diccionario está vacío, devuelveNone
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