यह जाँचने के लिए कि निम्नलिखित सभी वस्तुएँ किसी सूची में कैसे हैं?


113

मैंने पाया, कि संबंधित प्रश्न है, यह कैसे पता करें कि किसी सूची में कम से कम एक आइटम मौजूद है या नहीं:
कैसे जांचा जाए कि निम्नलिखित में से कोई एक वस्तु सूची में है या नहीं?

लेकिन यह पता लगाने का सबसे अच्छा और पाइथोनिक तरीका क्या है कि क्या सभी आइटम एक सूची में मौजूद हैं?

डॉक्स के माध्यम से खोज करने पर मुझे यह समाधान मिला:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

अन्य समाधान यह होगा:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

लेकिन यहां आपको अधिक टाइपिंग करनी होगी।

क्या कोई और उपाय है?


5
इसमें गलत क्या है set(smaller) <= set(larger)?
यूमरियो

1
मुझे लगता है कि 'ऑल' के साथ आपका दूसरा समाधान मुझे ठीक और आकर्षक लगता है।
जिहो नोह

जवाबों:


156

<=पायथन जैसे ऑपरेटर आमतौर पर "कम से कम या इसके बराबर" की तुलना में कुछ अलग करने के लिए अतिरंजित नहीं होते हैं। मानक पुस्तकालय के लिए यह असामान्य है - यह मेरे लिए विरासत एपीआई की तरह खुशबू आ रही है।

समतुल्य और अधिक स्पष्ट रूप से नामित विधि का उपयोग करें set.issubset। ध्यान दें कि आपको तर्क को सेट में बदलने की आवश्यकता नहीं है; यदि आवश्यक हो तो यह आपके लिए करेंगे।

set(['a', 'b']).issubset(['a', 'b', 'c'])

2
पता नहीं था कि आप सूची को सीधे इस्सेट करने के तर्क के रूप में पास कर सकते हैं ... अच्छा!
tsimbalar

1
जब मैं भावना से सहमत हैं, मैं के विचार के साथ बहुत ठीक कर रहा हूँ <=और issubsetएक ही बात अर्थ। आप इसे नापसंद क्यों करते हैं?
कर्क स्ट्रूसर

2
@ जस्ट: मुख्य रूप से, क्योंकि यह स्पष्ट नहीं है कि <=किसी सेट के लिए इसका क्या अर्थ है या तो इसे डॉक्स में देखे बिना या पूर्व सिद्धांत में इसका क्या अर्थ है, जबकि हर कोई जानता है issubsetकि स्वचालित रूप से क्या मतलब है।
ग्लेन मेनार्ड

2
आप (गैर-उचित) सबसेट के लिए गणितीय ऑपरेटर जानते हैं? यह मूल रूप से एक गोल <=;) की तरह बहुत ज्यादा दिखता है
dom0

इस समाधान को प्यार करो। क्या बूल के बजाय एक सूचकांक स्थान या सूची मूल्य प्राप्त करने का एक तरीका है (सच: गलत)?
Vlad Gulin

62

मैं शायद setनिम्नलिखित तरीके से उपयोग करूंगा :

set(l).issuperset(set(['a','b'])) 

या अन्य तरह से गोल:

set(['a','b']).issubset(set(l)) 

मुझे यह थोड़ा अधिक पढ़ने योग्य लगता है, लेकिन यह अधिक मारक हो सकता है। सेट विशेष रूप से संघ / चौराहे / संग्रहों के बीच अंतर की गणना करने के लिए उपयोगी होते हैं, लेकिन यह इस स्थिति में सबसे अच्छा विकल्प नहीं हो सकता है ...


वास्तव में, MySet.issubset(MyOtherSet)और MySet <= MyOtherSetसमान हैं।
वोक

1
@wok: ओह मुझे यह नहीं पता था, लेकिन मुझे लगता है कि <= वाक्यविन्यास थोड़ा भ्रमित है क्योंकि समान सिंटैक्स का उपयोग सूचियों के साथ किया जा सकता है, लेकिन बहुत अलग अर्थ के साथ।
tsimbalar

3
यदि आप समावेश को याद करते हैं तो यह वास्तव में भ्रामक नहीं है कि सेट के किसी भी सेट पर एक आंशिक आदेश को परिभाषित किया गया है। यह वास्तव में थोड़ा भ्रामक है <=जिसका अर्थ है कि यह अनुक्रमों के लिए करता है: किसी को यह उम्मीद हो सकती है कि इसका अर्थ लेक्सिकोग्राफिक ऑर्डर के बजाय 'बाद का' है।
अरोनस्टरलिंग

1
@aronasterling: mmm, मैं व्यक्तिगत रूप से "आंशिक आदेश" के बारे में बहुत अधिक नहीं सोचता जब मैं कोड टाइप करता हूं :-), लेकिन मैं इस तथ्य पर सहमत हूं कि <=दृश्यों का उपयोग करना भी अजीब लगता है, किसी भी तरह ...
tsimbalar

3
मैं यहां एक छोटे से गोछा में भाग गया, जिसका मैं उल्लेख करना चाहता हूं: यदि आप इस पद्धति का उपयोग करते हैं, तो आप हैं अपनी सूचियों को सेट करने के लिए परिवर्तित रहे हैं , जिसका अर्थ है कि दो डुप्लिकेट। set(['a','a']).issubset(['a'])लौटता है True
ओरेंस्टार

11

मैं इन दोनों को पसंद करता हूं क्योंकि वे सबसे तार्किक लगते हैं, बाद वाला छोटा और शायद सबसे तेज ( setशाब्दिक वाक्य रचना का उपयोग करके दिखाया गया है जिसे पायथन 2.7 में वापस भेज दिया गया है ):

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})

"ऑल" सॉल्यूशन सबसे तेज़ है जब आप इसे टाइमिट () के साथ मापते हैं। यह स्वीकृत उत्तर होना चाहिए।
एटसनसन

3

क्या होगा अगर आपकी सूचियों में इस तरह डुप्लिकेट हैं:

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

सेट में डुप्लिकेट नहीं होते हैं। तो, निम्न पंक्ति सही है।

set(v2).issubset(v1)

डुप्लिकेट के लिए गणना करने के लिए, आप कोड का उपयोग कर सकते हैं:

v1 = sorted(v1)
v2 = sorted(v2)


def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2) 

तो, निम्न पंक्ति गलत है।

is_subseq(v2, v1)

1

यह वही था जो मैं ऑनलाइन खोज रहा था लेकिन दुर्भाग्य से ऑनलाइन नहीं मिला, लेकिन अजगर दुभाषिया पर प्रयोग करते हुए।

>>> case  = "caseCamel"
>>> label = "Case Camel"
>>> list  = ["apple", "banana"]
>>>
>>> (case or label) in list
False
>>> list = ["apple", "caseCamel"]
>>> (case or label) in list
True
>>> (case and label) in list
False
>>> list = ["case", "caseCamel", "Case Camel"]
>>> (case and label) in list
True
>>>

और यदि आपके पास में आयोजित चर की एक सूची है sublist variable

>>>
>>> list  = ["case", "caseCamel", "Case Camel"]
>>> label = "Case Camel"
>>> case  = "caseCamel"
>>>
>>> sublist = ["unique banana", "very unique banana"]
>>>
>>> # example for if any (at least one) item contained in superset (or statement)
...
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
False
>>>
>>> sublist[0] = label
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>> # example for whether a subset (all items) contained in superset (and statement)
...
>>> # a bit of demorgan's law
...
>>> next((False for item in sublist if item not in list), True)
False
>>>
>>> sublist[1] = case
>>>
>>> next((False for item in sublist if item not in list), True)
True
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>>

0

एक लंबोदर अभिव्यक्ति का उपयोग करके यह कैसे करना है, इसका एक उदाहरण होगा:

issublist = lambda x, y: 0 in [_ in x for _ in y]

1
कृपया अपने उत्तर को स्पष्ट करने के लिए टिप्पणी जोड़ें / विस्तृत करें
शरद

0

ओपी का मामला नहीं है, लेकिन - जो कोई भी डॉक में चौराहे पर चढ़ना चाहता है और खराब गोग्लिंग (जैसे मुझे) के कारण यहां समाप्त हो गया है - आपको इसके साथ काम करने की आवश्यकता है dict.items:

>>> a = {'key': 'value'}
>>> b = {'key': 'value', 'extra_key': 'extra_value'}
>>> all(item in a.items() for item in b.items())
True
>>> all(item in b.items() for item in a.items())
False

ऐसा इसलिए है क्योंकि dict.itemsकुंजी / मूल्य जोड़े के टुपल्स लौटाते हैं, और पायथन में किसी भी वस्तु की तरह, वे परस्पर भिन्न हैं

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