अजगर: देखें कि क्या एक सेट में एक और पूरी तरह से शामिल है?


86

क्या यह जांचने का एक तेज़ तरीका है कि क्या एक सेट में पूरी तरह से दूसरा है?

कुछ इस तरह:

>>>[1, 2, 3].containsAll([2, 1])
True

>>>[1, 2, 3].containsAll([3, 5, 9])
False

जवाबों:


131

वे सूचियाँ हैं, लेकिन अगर आप वास्तव में सेट का मतलब है कि आप issubset विधि का उपयोग कर सकते हैं।

>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True

एक सूची के लिए, आप प्रत्येक तत्व की जांच करने से बेहतर नहीं कर पाएंगे।


3
मुझे इस उत्तर को देखने पर मुझे डेववु का एक अजीब सा अहसास होता है
क्रिस्टोफ रूसो

आप के शब्दों के बारे में पता होना जरूरी issubset()है नहींcontains()
wikier

37

पूर्णता के लिए: यह समतुल्य है issubset(हालाँकि यकीनन थोड़ा कम स्पष्ट / पठनीय है):

>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False

समस्या एक = सेट ([]) और बी = सेट (['ए', 'बी']) है तो a.issubset (b) सत्य है
darkman

4

एक विकल्प अछूता रह गया है - घटाव:

>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])

मूल रूप से आप जांचते हैं कि पहली सूची में कौन से तत्व दूसरी सूची में नहीं हैं।

मुझे यह बहुत आसान लगा क्योंकि आप दिखा सकते हैं कि क्या मूल्य गायब हैं:

>>> def check_contains(a, b):
...     diff = a - b
...     if not diff:
...         # All elements from a are present in b
...         return True
...     print('Some elements are missing: {}'.format(diff))
...     return False
...
>>> check_contains({1, 2}, {1, 2, 3})
True
>>> check_contains({1, 2, 3}, {1, 2})
Some elements are missing: set([3])
False

4

आप set.issubset()या तो set.issuperset()(या उनके ऑपरेटर आधारित समकक्षों का उपयोग कर सकते हैं : <=और >=)। ध्यान दें कि विधियां किसी भी तर्क को एक तर्क के रूप में स्वीकार करेंगी , न कि केवल एक सेट के लिए:

>>> {1, 2}.issubset([1, 2, 3])
True
>>> {1, 2, 3}.issuperset([1, 2])
True

हालाँकि, यदि आप ऑपरेटरों का उपयोग करते हैं, तो दोनों तर्क सेट होने चाहिए:

>>> {1, 2} <= {1, 2, 3}
True
>>> {1, 2, 3} >= {1, 2}
True

4

यदि आपको किसी सेट पर दूसरे का उपसमूह होने का संदेह है, और उन दो सेटों को एक साथ जोड़ते हैं, तो इसका परिणाम स्वयं के बराबर है यदि यह सबसेट है।

a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True

1
चलो A = set(a)और B = set(b)पवित्रता के लिए। तब यह तुलना कुशलता से की जाती है len(A.intersection(B)) == len(A)। यही है, सेटों को स्वयं तत्व-वार की तुलना करने की आवश्यकता नहीं है; केवल इन सेटों की कार्डिनैलिटी की तुलना की जानी चाहिए। हालांकि इस अनुकूलन को इस दृष्टिकोण को प्राथमिकता देने के लिए संभवतः अपर्याप्त है, हालांकि। नाटकीय रूप से अधिक पठनीय और कुशल issubset()और <=दृष्टिकोण लगभग निश्चित रूप से हर कोई चाहता है।
सेसिल करी

@CecilCurry True - मैंने 'कार्डिनैलिटी' शब्द का गलत इस्तेमाल किया क्योंकि यह लंबाई माप है। मैंने शब्दांकन अपडेट कर दिया है। आपका अनुकूलन मेरी त्रुटि के आधार पर एक त्रुटि है। अनुकूलन नहीं। "चौराहे ()" का शाब्दिक शब्दांकन "> =" के अतिभारित निहितार्थों की तुलना में अधिक स्पष्ट है और यह बताते हुए कि "issubset ()" पढ़ने में आसान है स्पष्ट का एक तरह से उन्मूलन है क्योंकि यह सबसे लोकप्रिय उत्तर है। दूसरों के उत्तरों को दोहराने से परे एक रचनात्मक समाधान में योगदान करने के लिए स्वतंत्र महसूस करें।
जॉर्डन स्टेफनेली

1
>>> set([1,2,3]).issuperset(set([2,1]))
True 
>>>    
>>> set([1,2,3]).issuperset(set([3,5,9]))
False

3
ठीक से उत्तर देने और कुछ स्पष्टीकरण जोड़ने के लिए विचार करें।
सैम

0

यदि फ़ंक्शनलिस्ट में पूर्णांक शामिल नहीं है, तो फ़ंक्शन वापसी 0 से नीचे है और यदि पूरी तरह से 1 शामिल है।

def islistsubset(sublist,mainlist):
     for item in sublist:
             if item in mainlist:
                     contains = 1
             else:
                     contains = 0
                     break;
     return contains

1
यह O (n ^ 2) है, जबकि मौजूदा कुछ जवाबों में सेट ऑपरेशंस का उपयोग करना ज्यादा तेज है। यह भी बस लिखा जा सकता है any(item in mainlist for item in sublist)
इगुआनाटुत

Infact से सहमत मैं def islistubset (सबलिस्ट, मेन लिस्ट) भी लिख सकता है: सबलिस्ट में आइटम के लिए = 1 शामिल है: यदि आइटम मेनलिस्ट में है: जारी रखें: जारी रखें: = 0 ब्रेक; वापसी में प्रति कॉल केवल 2 असाइनमेंट शामिल हैं
बोबिन मोटी थॉमस

@BusinMottiThomas आप किसी भी अस्थायी चर को बनाए बिना सीधे सही या गलत लौटा सकते हैं। list_a में आइटम के लिए: यदि list_b में आइटम नहीं है: रिटर्न गलत लौटें सही
जॉर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.