Python: Перевірка, чи "Словник" порожній, здається, не працює


396

Я намагаюся перевірити, чи словник порожній, але він не працює належним чином. Він просто пропускає його і відображає 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())) 

6
Щоб перевірити, чи self.usersнемає порожнього просто, просто зробіть if self.users.
BrenBarn

4
Ви isEmptyнасправді повертаєтеся, Trueякщо перший ключ із словника справжній, а повертається Falseінакше. Якщо словник порожній, він повертає, Noneщо ні == False.
Гіперборей

Ваше запитання, якщо зворотне.
Божевільний фізик

будьте обережні до помилкових ключів stackoverflow.com/a/17347421/1379762
Wajih

Відповіді:


737

Порожні словники оцінюються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
@Wajih, які ви посилаєте, не має значення: bool({False: False})все одно оцінюється True. Посилання, яке ви надали, відповідає anyметоду, який залежить від клавіш.
Ulysse BN

@Wajih що це означає?
Чарлі Паркер

2
Я відчуваю, що "не
диктувати

погодився, я відчуваю, що користуюся булевими, і not <dict>це теж не ясно
cryanbhu

130

Ось трьома способами можна перевірити, чи диктатура порожня. Хоча я вважаю за краще використовувати лише перший спосіб. Два інших способи є надто виразними.

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"

44
Зітхніть ... всі люблять бути "пітонічними" і мають набрати найменше символів. По-перше, ще одним критерієм є читабельність. По-друге, перший тест у відповіді вище відповідає не лише тому, що дікт існує та порожній, але й якщо тест_виконання є Немає. Тому використовуйте цей тест лише тоді, коли ви знаєте, що об'єкт dict існує (або коли різниця не має значення). Другий спосіб також має таку поведінку. Лише третій спосіб гавкає, якщо тестовий вирок немає.
Андреас Маєр

1
@AndreasMaier Точно так само і моє почуття. Також пітон динамічно набирається. Всередині функції звичайно перевіряти "якщо x - не порожній словник, то зробіть це; якщо x - не порожній numpy масив, то зробіть це". Тоді перший код не вдасться увімкнути, if xколи x - це масивний масив
jf328

1
@ Ваші посилання тут все ще не мають значення ... Дивіться, чому
Ulysse BN

1
Не звертаючись до цього, хоча технічно правильно через проблеми, з якими я поділяюся. @AndreasMaier
Штюрмер

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

якщо довжина дорівнює нулю, означає, що дикт порожній


3
Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
DimaSan

1
len(dict.keys())еквівалентноlen(dict)
pdpAxis

@pdpAxis У значенні, яке воно дає, хоча, маю надію, реалізація dict.__len__, ймовірно, трохи швидша. :)
Mateen Ulhaq

6

Нижче прості способи перевірити порожній вигляд

        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'}


-1

Ви також можете використовувати get (). Спочатку я вважав це лише перевірити, чи існує ключ.

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

Мені подобається отримати те, що це не викликає винятку, тому це дозволяє легко переміщати великі структури.


-4

Чому б не використовувати тест на рівність?

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

Це виглядає як синтаксична помилка і не показує, як застосувати перевірку в контексті запитання.
Roland Weber

-7

використовувати "будь-який"

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anyперевіряє, чи не містить диктантний ключ, наприклад, any({0: 'something'})повертає, Falseнавіть якщо
дикт

так, щоб зберегти від обох випадків, правду та порожню, інший мудрий бул би справджував справжній випадок. якщо ви думаєте в цілях кодування взагалі.
chhotu sardar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.