पायथन: अगर एक 'शब्दकोश' खाली है तो जाँच करना काम नहीं करता है


396

मैं यह जांचने की कोशिश कर रहा हूं कि क्या कोई शब्दकोश खाली है लेकिन यह ठीक से व्यवहार नहीं करता है। यह सिर्फ इसे छोड़ देता है और संदेश प्रदर्शित करने के अलावा कुछ भी बिना ऑनलाइन प्रदर्शित करता है । कोई विचार क्यों?

 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
ब्रेनबार

4
यदि isEmptyवास्तव Trueमें शब्दकोश से प्राप्त की गई पहली कुंजी सत्य है और Falseअन्यथा वापस आती है, तो आपकी वास्तव में वापसी होती है । यदि शब्दकोश खाली है, तो वह वापस आ जाता है Noneजो नहीं है == False
हाइपरबोरस

आपका यदि कथन पीछे की ओर है।
मैड फिजिसिस्ट

झूठी-तरह की चाबियों से सावधान रहें stackoverflow.com/a/17347421/1379762
वजीह

जवाबों:


736

पायथन में खाली शब्दकोश का मूल्यांकन करेंFalse :

>>> 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विधि के अनुरूप दिया , जो कुंजियों पर निर्भर करता है।
उलिसे बीएन

@ का मतलब क्या है?
चार्ली पार्कर

2
मुझे लगता है 'स्पष्ट नहीं' स्पष्ट नहीं है
13

सहमत हूँ, मुझे लगता है कि बूलियन्स का उपयोग करना और not <dict>यह भी स्पष्ट नहीं है
क्रैनभू

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
आहें ... हर कोई "पायथोनिक" होना पसंद करता है और टाइप करने के लिए कम से कम वर्णों के लिए जाता है। पहला, एक और मापदंड पठनीयता है। दूसरा, ऊपर दिए गए उत्तर में पहला परीक्षण न केवल सच है यदि ताना मौजूद है और खाली है, बल्कि यह भी कि test_dict कोई नहीं है। इसलिए इस परीक्षण का उपयोग केवल तब करें जब आप जानते हैं कि तानाशाह वस्तु मौजूद है (या जब अंतर कोई फर्क नहीं पड़ता)। दूसरे तरीके में भी वह व्यवहार होता है। केवल तीसरा तरीका भौंकता है अगर test_dict कोई नहीं है।
एंड्रियास मैयर

1
@AndreasMaier वास्तव में मेरी भावना भी। इसके अलावा, अजगर गतिशील रूप से टाइप किया जाता है। किसी फ़ंक्शन के अंदर यह जांचना आम है कि "यदि x गैर-रिक्त शब्दकोश है, तो ऐसा करें; यदि x गैर-रिक्त संख्यात्मक सरणी है, तो ऐसा करें"। तब पहला कोड तब विफल हो जाएगा if xजब x सुन्न सरणी है
jf328

1
@Wajih आप लिंक अभी भी यहाँ अप्रासंगिक है ... देखें क्यों
Ulysse BN

1
तकनीकी रूप से सही होने वाली चिंताओं के कारण इसे साझा नहीं कर रहा हूं। @AndreasMaier
स्टनर

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

यदि लंबाई शून्य है तो इसका मतलब है कि तानाशाही खाली है


3
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
दिमासन

1
len(dict.keys())के बराबर हैlen(dict)
pdpAxis

@pdpAxis मूल्य में यह देता है, हालांकि मुझे यकीन है कि कार्यान्वयन dict.__len__शायद थोड़ा तेज है। :)
मतीन उल्हाक

6

खाली हुक की जांच करने के सरल तरीके नीचे दिए गए हैं:

        a= {}

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

यद्यपि विधि 1 अधिक सख्त है क्योंकि a = कोई नहीं, विधि 1 सही परिणाम प्रदान करेगा लेकिन विधि 2 गलत परिणाम देगा।


1

एक शब्दकोश स्वचालित रूप से बूलियन के लिए डाला जा सकता है जो Falseखाली शब्दकोश के लिए और Trueगैर-खाली शब्दकोश के लिए मूल्यांकन करता है ।

if myDictionary: non_empty_clause()
else: empty_clause()

यदि यह बहुत मुहावरेदार लगता है, तो आप len(myDictionary)शून्य के लिए, या set(myDictionary.keys())एक खाली सेट के लिए, या बस समानता के लिए परीक्षण कर सकते हैं {}

Ismpty फ़ंक्शन न केवल अनावश्यक है, बल्कि आपके कार्यान्वयन में भी कई समस्याएँ हैं, जिन्हें मैं prima-facie कर सकता हूं।

  1. return Falseबयान बहुत गहरा एक स्तर इंडेंट है। यह लूप के लिए और forस्टेटमेंट के समान स्तर पर होना चाहिए । परिणामस्वरूप, आपका कोड केवल एक ही प्रक्रिया करेगा, यदि कोई कुंजी मौजूद है, तो मनमाने ढंग से चयनित कुंजी। यदि कोई कुंजी मौजूद नहीं है, तो फ़ंक्शन वापस आ जाएगा None, जिसे बूलियन फाल्स में डाला जाएगा। आउच! सभी खाली शब्दकोशों को झूठे-नागर के रूप में वर्गीकृत किया जाएगा।
  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 !")

यह एक वाक्यविन्यास त्रुटि की तरह दिखता है, और यह नहीं दिखाता है कि प्रश्न के संदर्भ में चेक कैसे लागू किया जाए।
रोलैंड वेबर

-7

'कोई' का उपयोग करें

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anyजांच करता है कि dict किसी भी truthy कुंजी, जैसे शामिल any({0: 'something'})रिटर्न Falseभी dict हालांकि खाली नहीं है
Railslide

हाँ, दोनों मामलों से बचाने के लिए, सत्य और कोरी, अन्य बुद्धिमान बूल सच मामले के लिए सच दे दिया होता। यदि आप सामान्य कोडिंग उद्देश्य में सोचते हैं।
छोटू सरदार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.