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.
-
return False
утверждение имеет отступ на один уровень слишком глубоко. Он должен находиться вне цикла for и на том же уровне, что и оператор for
. В результате ваш код будет обрабатывать только один произвольно выбранный ключ, если ключ существует. Если ключ не существует, функция вернет None
, который будет приведен к логическому False. Ой! Все пустые словари будут классифицированы как ложные слова. - Если словарь не пуст, то код обработает только один ключ и вернет его значение, приведенное к логическому значению. Вы даже не можете предположить, что один и тот же ключ оценивается каждый раз, когда вы вызываете его. Так что будут ложные срабатывания.
- Допустим, вы исправили отступ в операторе
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