Python: проверка «словаря» пуста не работает

398

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

 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())) 
беспощадный
источник
6
Чтобы проверить, если self.usersне пусто, просто сделайте if self.users.
BrenBarn
4
Ваш isEmptyфактически возвращается, Trueесли первый ключ, полученный из словаря, является истинным и возвращает Falseиначе. Если словарь пуст, он возвращает Noneчто нет == False.
Гиперборей
Ваше заявление if обратное.
Безумный физик
будьте осторожны с ложно подобными ключами stackoverflow.com/a/17347421/1379762
Wajih

Ответы:

739

Пустые словари оцениваются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()))

источник
7
@ Ваджи, на который вы ссылаетесь, не имеет значения: по- bool({False: False})прежнему оценивается как True. Ссылка, которую вы дали, соответствует anyметоду, который зависит от ключей.
Ulysse BN
@ Ваджи, что это значит?
Чарли Паркер
2
Я чувствую, что «не диктат» не является явным
имбатман
согласен, я чувствую, что использую логические значения, и not <dict>это не так ясно
cryanbhu
130

Вот три способа проверить, является ли 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"
doubleo
источник
44
Вздох ... всем нравится быть "питонами" и стараться набирать как можно меньше символов. Во-первых, еще одним критерием является удобочитаемость. Во-вторых, первый тест в ответе выше верен не только, если dict существует и является пустым, но также и если test_dict равен None. Поэтому используйте этот тест только тогда, когда вы знаете, что объект dict существует (или когда разница не имеет значения). Второй способ также имеет такое поведение. Только третий способ лает, если test_dict равен None.
Андреас Майер
1
@AndreasMaier Точно мои чувства. Кроме того, Python динамически типизируется. Внутри функции обычно проверяется, «если x - непустой словарь, тогда сделайте это; если x - непустой массив numpy, то сделайте это». Тогда первый код потерпит неудачу, if xкогда x это пустой массив
jf328
1
@ Wajih ваша ссылка все еще не имеет значения здесь ... Узнайте, почему
Ulysse BN
1
Не одобряю это, хотя технически правильно из-за проблем, с которыми я разделяю. @AndreasMaier
Stunner
16
dict = {}
print(len(dict.keys()))

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

Ахиллес Рам Накиреканти
источник
3
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
DimaSan
1
len(dict.keys())эквивалентноlen(dict)
pdpAxis
@pdpAxis В значении, которое это дает, хотя я держу пари, что реализация, dict.__len__вероятно, немного быстрее. :)
Матин Улхак
6

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

        a= {}

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

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

Шагун Прути
источник
1

Словарь может быть автоматически приведен к логическому значению, которое оценивается как 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'}

Della
источник
-1

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

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

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

MortenB
источник
-4

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

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")
wieczorek1990
источник
Это похоже на синтаксическую ошибку и не показывает, как применить проверку в контексте вопроса.
Роланд Вебер
-7

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

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty
чхоту сардар
источник
4
anyпроверяет, содержит ли dict какой-либо правдивый ключ, например any({0: 'something'})возвращает, Falseдаже если dict не пуст
Railslide
да, чтобы спасти от обоих случаев, правдивых и пустых, другой мудрый бул дал бы истину для правдивых случаев. если вы думаете, в целом цель кодирования.
Chhotu Sardar