Python: проверка того, что "словарь" пуст, кажется, не работает

Я пытаюсь проверить, свободен ли словарь, но он не ведет себя правильно. Он просто пропускает его и отображает ONLINE без каких-либо изменений, кроме отображения сообщения. Любые идеи, почему?

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

Ответы

Ответ 1

Пустые словари оценивать False в Python:

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

Таким образом, ваша функция isEmpty не нужна. Все, что вам нужно сделать, это:

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

Ответ 2

Вот три способа проверить, является ли dict пустым. Я предпочитаю использовать только первый способ. Остальные два способа слишком многословны.

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"

Ответ 3

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

если длина равна нулю, значит, что dict пуст

Ответ 4

Python 3:

def is_empty(dict):
   if not bool(dict):
      return True
   return False

test_dict = {}
if is_empty(test_dict):
    print("1")

test_dict = {"a":123}
if not is_empty(test_dict):
    print("1")

Ответ 5

Простые способы проверить пустой dict ниже:

        a= {}

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

Хотя метод 1 является более строгим, чем когда a = None, метод 1 даст правильный результат, но метод 2 даст неправильный результат.

Ответ 6

Словарь может быть автоматически приведен к логическому значению, которое оценивается как False для пустого словаря и True для непустого словаря.

if myDictionary: non_empty_clause()
else: empty_clause()

Если это выглядит слишком идиоматично, вы можете также проверить len(myDictionary) на ноль или set(myDictionary.keys()) для пустого набора, или просто проверить на равенство с {}.

Функция isEmpty не только не нужна, но и ваша реализация имеет множество проблем, которые я могу заметить prima-facie.

  1. return False утверждение имеет отступ на один уровень слишком глубоко. Он должен находиться вне цикла for и на том же уровне, что и оператор for. В результате ваш код будет обрабатывать только один произвольно выбранный ключ, если ключ существует. Если ключ не существует, функция вернет None, который будет приведен к логическому False. Ой! Все пустые словари будут классифицированы как ложные слова.
  2. Если словарь не пуст, то код обработает только один ключ и вернет его значение, приведенное к логическому значению. Вы даже не можете предположить, что один и тот же ключ оценивается каждый раз, когда вы вызываете его. Так что будут ложные срабатывания.
  3. Допустим, вы исправили отступ в операторе return False и вывели его за пределы цикла for. Тогда вы получите логическое ИЛИ всех ключей или False если словарь пуст. Тем не менее у вас будут ложные срабатывания и ложные отрицания. Сделайте исправление и проверьте следующий словарь для доказательства.

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

Ответ 7

Вы также можете использовать get(). Первоначально я верил, что он проверяет только, существует ли ключ.

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

То, что мне нравится с get, заключается в том, что оно не вызывает исключение, поэтому упрощает перемещение больших структур.

Ответ 8

Почему бы не использовать тест на равенство?

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

Ответ 9

используйте "любой"

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty