Как проверить, пуст ли словарь?
Я пытаюсь проверить, пустой ли словарь, но он работает неправильно. Вместо того чтобы корректно обрабатывать это условие, код просто пропускает его и отображает сообщение 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()))
5 ответ(ов)
Вот три способа проверить, пустой ли словарь. Я предпочитаю использовать только первый способ, так как остальные два слишком громоздкие.
test_dict = {}
if not test_dict:
print("Словарь пустой")
if not bool(test_dict):
print("Словарь пустой")
if len(test_dict) == 0:
print("Словарь пустой")
Первый способ самый лаконичный и читаемый.
Простые способы проверить, является ли словарь пустым, приведены ниже:
a = {}
-
if a == {}: print('пустой словарь')
-
if not a: print('пустой словарь')
Первый метод более строгий, поскольку когда a = None
, первый метод даст правильный результат, тогда как второй метод выдаст неправильный результат.
В вашем коде d = {}
создается пустой словарь. Функция len(d.keys())
возвращает количество ключей в словаре. Поскольку словарь пустой, длина будет равна нулю. Это означает, что словарь действительно пустой. Если вам нужно проверить, пуст ли словарь, можно просто использовать условие if not d:
.
Словарь в Python можно автоматически привести к логическому типу, при этом пустой словарь будет оцениваться как False
, а непустой — как True
. Это можно сделать следующим образом:
if myDictionary:
non_empty_clause()
else:
empty_clause()
Если вам кажется, что такой подход слишком идиоматичен, вы также можете проверить len(myDictionary)
на равенство нулю, использовать set(myDictionary.keys())
для проверки на пустое множество или просто сравнить со словарем {}
.
Функция isEmpty
не только ненужна, но и ваша реализация содержит несколько проблем, которые видно сразу:
Оператор
return False
имеет неправильный уровень отступа. Он должен быть на том же уровне, что и операторfor
, а не внутри цикла. В результате ваш код будет обрабатывать только один, произвольно выбранный ключ, если такой существует. Если ключа нет, функция вернётNone
, который будет приведен к логическомуFalse
. Это приведёт к тому, что все пустые словари будут классифицироваться как ложные отрицания.Если словарь не пустой, то код будет обрабатывать только один ключ и возвращать его значение, приведенное к логическому типу. Невозможно даже предполагать, что каждый раз будет оцениваться один и тот же ключ, поэтому у вас будут ложные положительные результаты.
Допустим, вы исправили отступ для оператора
return False
и вынесли его за пределы циклаfor
. В этом случае вы получите логическое ИЛИ всех ключей илиFalse
, если словарь пуст. Однако, даже после исправления, у вас всё равно останутся ложные положительные и ложные отрицательные результаты. Проверьте вашу функцию на следующем словаре для подтверждения:
myDictionary = {0: 'zero', '': 'Empty string', None: 'None value', False: 'Boolean False value', (): 'Empty tuple'}
Важно помнить, что простая проверка на истинность является наиболее эффективным и безопасным способом определения пустоты словаря в Python.
1-й способ
len(given_dic_obj)
Возвращает 0, если в словаре нет элементов. В противном случае возвращает количество элементов в словаре.
2-й способ
bool(given_dic_object)
Возвращает False
, если словарь пустой, в противном случае возвращает True
.
Создание словаря с помощью генератора словарей
Преобразование списка словарей в DataFrame pandas
Следует ли использовать 'has_key()' или 'in' для проверки наличия ключа в словарях Python?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"