Python: Verificar se um 'Dicionário' está vazio não parece funcionar


396

Estou tentando verificar se um dicionário está vazio, mas não se comporta corretamente. Apenas o ignora e exibe ONLINE sem nada, exceto exibir a mensagem. Alguma idéia do porquê?

 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
Para verificar se self.usersnão está vazio, basta fazer if self.users.
BrenBarn

4
Você isEmptyrealmente retornará Truese a primeira chave gerada no dicionário for true e retornar Falsecaso contrário. Se o dicionário estiver vazio, ele retornará o Noneque não está == False.
Hyperboreus

Sua declaração if está ao contrário.
Página Inicial>


Respostas:


737

Dicionários vazios são avaliadosFalse em Python:

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

Assim, sua isEmptyfunção é desnecessária. Tudo que você precisa fazer é:

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 você link é irrelevante: bool({False: False})ainda avalia para True. O link que você forneceu corresponde ao anymétodo, que depende das chaves.
Ulysse BN

@Wajih, o que isso significa?
Charlie Parker

2
Sinto-me 'não dict' não é explícita
imbatman

concordou, eu sinto que usando os booleans e not <dict>não está claro demais
cryanbhu

130

Aqui estão três maneiras de verificar se o dict está vazio. Eu prefiro usar a primeira maneira apenas embora. As outras duas maneiras são muito prolixo.

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
Suspiro ... todo mundo gosta de ser "pitônico" e procura o mínimo de caracteres para digitar. Primeiro, outro critério é a legibilidade. Segundo, o primeiro teste na resposta acima é verdadeiro não apenas se o ditado existir e estiver vazio, mas também se test_dict for None. Portanto, use esse teste apenas quando souber que o objeto dict existe (ou quando a diferença não importa). A segunda maneira também tem esse comportamento. Somente a terceira maneira late se test_dict for None.
Andreas Maier

11
@AndreasMaier Exatamente meu sentimento também. Além disso, o python é digitado dinamicamente. Dentro de uma função, é comum verificar "se x é um dicionário não vazio, faça isso; se x é uma matriz numpy não vazia, faça isso". Em seguida, o primeiro código irá falhar em if xquando x é numpy matriz
jf328

11
@Wajih você link ainda é irrelevante aqui ... Veja por que
Ulysse BN

11
Não votando nisso, embora tecnicamente correto devido a preocupações com as quais compartilho. @AndreasMaier
Stunner

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

se comprimento for zero significa que o dict está vazio


3
Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código.
DimaSan

11
len(dict.keys())é equivalente alen(dict)
pdpAxis

@pdpAxis No valor que dá, embora aposto que a implementação do dict.__len__é provavelmente um pouco mais rápida. :)
Mateen Ulhaq 11/06

6

Maneiras simples de verificar um ditado vazio estão abaixo:

        a= {}

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

Embora o método 1 seja mais rigoroso como quando a = Nenhum, o método 1 fornecerá o resultado correto, mas o método 2 fornecerá um resultado incorreto.


1

Um dicionário pode ser convertido automaticamente para booleano, que avalia Falsepara dicionário vazio e Truepara dicionário não vazio.

if myDictionary: non_empty_clause()
else: empty_clause()

Se isso parecer muito idiomático, você também pode testar len(myDictionary)para zero, ou set(myDictionary.keys())para um conjunto vazio, ou simplesmente para testar a igualdade com {}.

A função isEmpty não é apenas desnecessária, mas também sua implementação tem vários problemas que eu posso identificar prima-facie.

  1. A return Falsedeclaração é recuada um nível muito profundo. Ele deve estar fora do loop for e no mesmo nível da forinstrução. Como resultado, seu código processará apenas uma chave selecionada arbitrariamente, se houver uma chave. Se uma chave não existir, a função retornará None, que será convertida em booleano False. Ai! Todos os dicionários vazios serão classificados como falso-nagativos.
  2. Se o dicionário não estiver vazio, o código processará apenas uma chave e retornará seu valor convertido para booleano. Você não pode nem assumir que a mesma chave é avaliada toda vez que você a chama. Portanto, haverá falsos positivos.
  3. Digamos que você corrija o recuo da return Falsedeclaração e a traga para fora do forloop. Então, o que você obtém é o OR booleano de todas as chaves ou Falsese o dicionário está vazio. Ainda assim, você terá falsos positivos e falsos negativos. Faça a correção e teste no dicionário a seguir para obter uma evidência.

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


-1

Você também pode usar get (). Inicialmente, eu acreditava que apenas verificaria se a chave existia.

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

O que eu gosto no get é que ele não aciona uma exceção, facilitando o deslocamento de estruturas grandes.


-4

Por que não usar teste de igualdade?

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

Parece um erro de sintaxe e não mostra como aplicar a verificação no contexto da pergunta.
Roland Weber

-7

use 'qualquer'

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anyverifica se o dict contém qualquer tecla truthy, por exemplo, any({0: 'something'})retornos False, mesmo que o dict não está vazio
railslide

Sim, para salvar de ambos os casos, verdadeiro e em branco, outro booliano teria dado verdadeiro para o caso verdadeiro. se você pensa no propósito geral de codificação.
Chhotu sardar 14/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.