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()))
python
dictionary
Unsparing
fonte
fonte
self.users
não está vazio, basta fazerif self.users
.isEmpty
realmente retornaráTrue
se a primeira chave gerada no dicionário for true e retornarFalse
caso contrário. Se o dicionário estiver vazio, ele retornará oNone
que não está== False
.Respostas:
Dicionários vazios são avaliados
False
em Python:Assim, sua
isEmpty
função é desnecessária. Tudo que você precisa fazer é:fonte
bool({False: False})
ainda avalia paraTrue
. O link que você forneceu corresponde aoany
método, que depende das chaves.not <dict>
não está claro demaisAqui 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.
fonte
if x
quando x é numpy matrizse comprimento for zero significa que o dict está vazio
fonte
len(dict.keys())
é equivalente alen(dict)
dict.__len__
é provavelmente um pouco mais rápida. :)Maneiras simples de verificar um ditado vazio estão abaixo:
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.
fonte
Um dicionário pode ser convertido automaticamente para booleano, que avalia
False
para dicionário vazio eTrue
para dicionário não vazio.Se isso parecer muito idiomático, você também pode testar
len(myDictionary)
para zero, ouset(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.
return False
declaração é recuada um nível muito profundo. Ele deve estar fora do loop for e no mesmo nível dafor
instruçã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.return False
declaração e a traga para fora dofor
loop. Então, o que você obtém é o OR booleano de todas as chaves ouFalse
se 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'}
fonte
Você também pode usar get (). Inicialmente, eu acreditava que apenas verificaria se a chave existia.
O que eu gosto no get é que ele não aciona uma exceção, facilitando o deslocamento de estruturas grandes.
fonte
Por que não usar teste de igualdade?
fonte
use 'qualquer'
fonte
any
verifica se o dict contém qualquer tecla truthy, por exemplo,any({0: 'something'})
retornosFalse
, mesmo que o dict não está vazio