अगर सेट खाली हो तो रिटर्निंग बूलियन


97

मैं बूलियन मान वापस करने का एक और अधिक स्वच्छ तरीका खोजने के लिए संघर्ष कर रहा हूं यदि मेरा सेट मेरे फ़ंक्शन के अंत में खाली है

मैं दो सेटों का प्रतिच्छेदन लेता हूं, और यदि परिणामी सेट खाली है, तो वापस लौटना Trueया Falseआधारित होना चाहता हूं ।

def myfunc(a,b):
    c = a.intersection(b)
    #...return boolean here

मेरा प्रारंभिक विचार करना था

return c is not None

हालाँकि, मेरे दुभाषिया में मैं आसानी से देख सकता हूँ कि यदि यह कथन सही है c = set([])

>>> c = set([])
>>> c is not None
True

मैंने निम्न में से सभी को आज़माया है:

>>> c == None
False
>>> c == False
False
>>> c is None
False

अब मैं प्रलेखन से पढ़ा है कि मैं केवल उपयोग कर सकते हैं and, orऔर notखाली सेट के साथ एक बूलियन मान निकालना। अब तक, केवल एक चीज जिसके साथ मैं लौट सकता हूं वह है सी नहीं

>>> not not c
False
>>> not c
True

मुझे लगता है कि ऐसा करने के लिए एक और अधिक pythonic तरीका है, मैं इसे खोजने के लिए संघर्ष कर रहा हूं। अगर मैं मानों की जरूरत नहीं है, तो मैं वास्तविक सेट को वापस नहीं करना चाहता क्योंकि मुझे यह जानना है कि क्या वे अंतरंग हैं।


4
: खाली सेट अगर आप इसे इतना डाली बूलियन झूठी बराबर माना जाता हैbool(set([]))
— woozyking

3
वैसे, गंभीरता से अच्छी तरह से काम किया सवाल है, जो उल्लेखनीय है।
— जोनास शफर

@JonasWielicki धन्यवाद! उत्तर की सराहना करें - पता था कि यह उन पंक्तियों के साथ कुछ था।
— CB

यह प्रश्न 5 वर्ष का होने जा रहा है और किसी ने सुझाव नहीं दिया है isdisjoint। मैं पूरी तरह से स्तब्ध हूं।
— आदिरियो

जवाबों:


67
def myfunc(a,b):
    c = a.intersection(b)
    return bool(c)

bool()कुछ ऐसा ही करेगा not not, लेकिन अधिक वैचारिक और स्पष्ट।


7
bool(...)जब आप पूछ रहे हैं तो मुझे आपत्ति है, is_emptyअस्पष्ट है। मैं इरादे जाहिर नहीं करता।
— Tamas.kenez

2
@ tamas.kenez आपको स्वीकार करना होगा, हालांकि, यह स्पष्ट है not not;)। (FTR: मैंने पहले ही @gefeis उत्तर को बदल दिया था, लेकिन ओपी द्वारा स्वीकार की गई बात पर मेरा कोई प्रभाव नहीं है ...)
— जोनास शफर

108

अन्य उत्तरों की तरह पाइथोनिक नहीं है, लेकिन गणित:

return len(c) == 0

जैसा कि कुछ टिप्पणियों ने len(set)जटिलता पर पड़ने वाले प्रभाव के बारे में सोचा था । यह O (1) है जैसा कि सोर्स कोड में दिखाया गया है यह एक वैरिएबल पर निर्भर करता है जो सेट के उपयोग को ट्रैक करता है।

static Py_ssize_t
set_len(PyObject *so)
{
    return ((PySetObject *)so)->used;
}

9
मुझे लगता है कि यह वास्तव में बेहतर है। यह स्पष्ट करता है कि आपका इरादा क्या है।
— अर्शजी

4
मुझे डर है len(c)कि cयह बहुत बड़े होने पर भी गणना करना होगा , जो खालीपन की जांच करने के लिए अनावश्यक है।
— मिशेल डे पास्कलिस

1
@ ग्लेज मुझे विश्वास है कि आमतौर पर इस्तेमाल किए जाने वाले डेटा स्ट्रक्चर्स (यानी लिस्ट, सेट) के लिए cpython लेन में O (1) है (यानी वे डेटास्ट्रक्चर पर एक वैरिएबल स्टोर करते हैं जो लंबाई का प्रतिनिधित्व करता है)
— CB

2
^ +1 @CB मैंने लेन (c) पर कुछ परीक्षण किए और यह निश्चित रूप से लेन का प्रतिनिधित्व करने वाला कुछ वैरिएबल है क्योंकि सेट साइज में परिमाण के नाटकीय क्रमों को बदलने पर नगण्य रनटाइम अंतर था।
— dster77

1
@ dster77 मैंने दोनों संस्करणों के साथ अपने कोड को प्रोफाइल किया और set()खिड़कियों में अजगर 3.5.2 के साथ तुलना करते समय यह काफी तेज था
— mathiasfk

23

यदि आप return Trueएक खाली सेट के लिए चाहते हैं , तो मुझे लगता है कि ऐसा करना स्पष्ट होगा:

return c == set()

अर्थात " cएक खाली के बराबर है set"।

(या, आसपास के अन्य तरीके के लिए return c != set())।

मेरी राय में, यह Falseब्यूटेन के संदर्भ में एक खाली सेट की अजगर की व्याख्या पर निर्भर होने से अधिक (हालांकि कम मुहावरेदार) है ।


2
दरअसल, पायथन की व्याख्या पर भरोसा करना बहुत स्वीकार्य अभ्यास है। जब तक इसकी सीमाओं को ध्यान में रखा जाता है।
— ज्वालामुखी

17

यदि cएक सेट है तो आप देख सकते हैं कि यह कार्य करके खाली है: return not c।

यदि cरिक्त है तो not cहो जाएगा True।

अन्यथा, यदि cकोई भी तत्व शामिल not cहैं False।


6

जब आप कहें:

c is not None

आप वास्तव में जाँच कर रहे हैं कि क्या c और कोई भी एक ही ऑब्जेक्ट को संदर्भित करता है। यही "ऑपरेटर" करता है। अजगर में कोई भी पारंपरिक रूप से एक विशेष अशक्त मूल्य नहीं है जिसका अर्थ है कि आपके पास कोई मूल्य उपलब्ध नहीं है। सी या जावा में छंटनी की तरह। चूँकि अजगर आंतरिक रूप से केवल एक का उपयोग करता है, कोई भी ऐसा मानने के लिए "है" ऑपरेटर का उपयोग करता है कि कोई कुछ नहीं है (विचार शून्य) काम करता है, और यह लोकप्रिय शैली बन गई है। हालाँकि यह सेट सी के सत्य मूल्य के साथ नहीं है, यह जाँच कर रहा है कि सी वास्तव में एक शून्य मान के बजाय एक सेट है।

यदि आप यह जांचना चाहते हैं कि क्या सशर्त विवरण में एक सेट खाली है, तो इसे संदर्भ के रूप में एक बूलियन के रूप में डाला जाता है, ताकि आप इसे केवल पढ़ सकें:

c = set()
if c:
   print "it has stuff in it"
else:
   print "it is empty"

लेकिन अगर आप चाहते हैं कि इसे एक बूलियन में परिवर्तित कर दिया जाए, तो आप कह सकते हैं:

c = set()
c_has_stuff_in_it = bool(c)

1
"""
This function check if set is empty or not.
>>> c = set([])
>>> set_is_empty(c)
True

:param some_set: set to check if he empty or not.
:return True if empty, False otherwise.
"""
def set_is_empty(some_set):
    return some_set == set()

0

बूल (सी) के रूप में साफ नहीं है लेकिन यह टर्नरी का उपयोग करने का एक बहाना था।

def myfunc(a,b):
    return True if a.intersection(b) else False

इसके अलावा एक ही तर्क का उपयोग करते हुए c को असाइन करने की कोई आवश्यकता नहीं है जब तक आप इसे किसी और चीज के लिए उपयोग नहीं कर रहे हैं।

def myfunc(a,b):
    return bool(a.intersection(b))

अंत में, मुझे लगता है कि आप एक सही / गलत मूल्य चाहते हैं क्योंकि आप इसके साथ कुछ प्रकार की बूलियन परीक्षा करने जा रहे हैं। मैं एक फ़ंक्शन कॉल और परिभाषा के ओवरहेड को लंघन करने की सलाह दूंगा जहां आपको इसकी आवश्यकता है।

के बजाय:

if (myfunc(a,b)):
    # Do something

शायद यह:

if a.intersection(b):
    # Do something
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.