Python: Sprawdzanie, czy „Słownik” jest pusty, nie działa

396

Próbuję sprawdzić, czy słownik jest pusty, ale nie działa poprawnie. Po prostu pomija go i wyświetla ONLINE bez niczego oprócz wyświetlania wiadomości. Jakieś pomysły dlaczego?

 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())) 
Nie szczędzący czegoś
źródło
6
Aby sprawdzić, czy nie self.usersjest pusta, po prostu zrób if self.users.
BrenBarn
4
Twój isEmptyfaktycznie zwraca, Truejeśli pierwszy klucz uzyskany ze słownika jest prawdziwy i zwraca Falseinaczej. Jeśli słownik jest pusty, zwraca, Noneco nie jest == False.
Hyperboreus,
Twoje oświadczenie if jest odwrócone.
Szalony fizyk
uważaj na fałszywe klucze stackoverflow.com/a/17347421/1379762
Wajih

Odpowiedzi:

737

Puste słowniki oceniająFalse w Pythonie:

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

Twoja isEmptyfunkcja jest więc niepotrzebna. Wszystko, co musisz zrobić, to:

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()))

źródło
7
@ Wajih link nie ma znaczenia: bool({False: False})nadal ocenia True. Podany link odpowiada anymetodzie, która zależy od kluczy.
Ulysse BN
@Wajih co to znaczy?
Charlie Parker,
2
Wydaje
Zgadzam się, mam ochotę korzystać z booleanów i not <dict>nie jest to również takie jasne
cryanbhu
130

Oto trzy sposoby sprawdzenia, czy dykt jest pusty. Wolę jednak używać tylko pierwszego sposobu. Pozostałe dwa sposoby są zbyt trudne.

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"
doubleo
źródło
44
Westchnienie ... wszyscy lubią być „pytoniczni” i starają się pisać jak najmniej znaków. Po pierwsze, innym kryterium jest czytelność. Po drugie, pierwszy test w powyższej odpowiedzi jest prawdziwy nie tylko wtedy, gdy dykt istnieje i jest pusty, ale także jeśli test_dict ma wartość None. Użyj tego testu tylko wtedy, gdy wiesz, że istnieje obiekt dict (lub gdy różnica nie ma znaczenia). Drugi sposób ma również takie zachowanie. Tylko trzeci sposób szczeka, jeśli test_dict to None.
Andreas Maier,
1
@AndreasMaier Dokładnie moje uczucie również. Python jest także dynamicznie wpisywany. Wewnątrz funkcji często sprawdza się „jeśli x jest niepustym słownikiem, zrób to; jeśli x jest niepustą tablicą numpy, zrób to”. Wtedy pierwszy kod się nie powiedzie, if xgdy x jest tablicą
numpy
1
@ Wajih link nie ma tu znaczenia ... Zobacz dlaczego
Ulysse BN
1
Nie głosuję za tym, choć technicznie poprawne z uwagi na obawy, którymi się dzielę. @AndreasMaier
Stunner,
16
dict = {}
print(len(dict.keys()))

jeśli długość wynosi zero, oznacza to, że dykt jest pusty

Achilles Ram Nakirekanti
źródło
3
Ten fragment kodu może rozwiązać pytanie, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że w przyszłości odpowiadasz na pytanie czytelników, a ci ludzie mogą nie znać przyczyn Twojej sugestii kodu.
DimaSan,
1
len(dict.keys())jest równoważne zlen(dict)
pdpAxis
@pdpAxis Podana wartość, choć założę się, że implementacja dict.__len__jest prawdopodobnie nieco szybsza. :)
Mateen Ulhaq
6

Poniżej znajdują się proste sposoby sprawdzenia pustego nagrania:

        a= {}

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

Chociaż metoda 1 jest bardziej rygorystyczna, niż gdy a = Brak, metoda 1 zapewni poprawny wynik, ale metoda 2 da niepoprawny wynik.

Shagun Pruthi
źródło
1

Słownik może być automatycznie rzutowany na boolean, którego wynikiem jest Falsepusty słownik i Trueniepusty słownik.

if myDictionary: non_empty_clause()
else: empty_clause()

Jeśli to wygląda zbyt idiomatycznie, możesz również przetestować len(myDictionary)na zero lub set(myDictionary.keys())na pusty zestaw, lub po prostu przetestować na równość z {}.

Funkcja isEmpty jest nie tylko niepotrzebna, ale także twoja implementacja ma wiele problemów, które mogę rozpoznać na pierwszy rzut oka.

  1. return FalseOświadczenie jest wcięty jeden poziom zbyt głęboko. Powinien znajdować się poza pętlą for i na tym samym poziomie, co forinstrukcja. W rezultacie Twój kod przetworzy tylko jeden, dowolnie wybrany klucz, jeśli klucz istnieje. Jeśli klucz nie istnieje, funkcja zwróci wartość None, która zostanie przekazana na wartość logiczną False. Auć! Wszystkie puste słowniki zostaną sklasyfikowane jako fałszywe.
  2. Jeśli słownik nie jest pusty, kod przetworzy tylko jeden klucz i zwróci jego wartość rzutowaną na boolean. Nie można nawet założyć, że ten sam klucz jest oceniany przy każdym wywołaniu. Będą więc fałszywe alarmy.
  3. Powiedzmy, że poprawiłeś wcięcie return Falseinstrukcji i wyprowadzasz ją poza forpętlę. Otrzymasz więc logiczne OR wszystkich kluczy lub Falsejeśli słownik jest pusty. Nadal będziesz mieć fałszywe pozytywy i fałszywe negatywy. Wykonaj korektę i przetestuj w oparciu o następujący słownik w celu uzyskania dowodów.

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

Della
źródło
-1

Możesz także użyć get (). Początkowo wierzyłem, że sprawdza tylko, czy klucz istnieje.

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

To, co lubię w get, to to, że nie wyzwala wyjątku, więc ułatwia przechodzenie przez duże struktury.

MortenB
źródło
-4

Dlaczego nie skorzystać z testu równości?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")
wieczorek1990
źródło
Wygląda to na błąd składniowy i nie pokazuje, jak zastosować sprawdzanie w kontekście pytania.
Roland Weber
-7

użyj „dowolne”

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty
chhotu sardar
źródło
4
anysprawdza, czy dykta zawiera jakiś prawdziwy klucz, np. any({0: 'something'})zwraca, Falsenawet jeśli
dykton
tak, aby uchronić się od obu przypadków, prawdomównych i pustych, inne mądre bool dałoby prawdę w przypadku prawdziwej sprawy. jeśli myślisz ogólnie o celu kodowania.
chhotu sardar