क्या सूचियों के लिए कोई छोटा कार्य है?


514

मैं देख रहा हूं कि लोग anyकिसी अन्य सूची को इकट्ठा करने के लिए उपयोग कर रहे हैं यह देखने के लिए कि क्या कोई आइटम किसी सूची में मौजूद है, लेकिन क्या सिर्फ करने का एक त्वरित तरीका है ?:

if list.contains(myItem):
    # do something

आपके प्रश्न का तात्पर्य है कि आप केवल सूची में रुचि रखते हैं जिसमें आइटम शामिल हैं , सूची में सबलिस्ट नहीं है? / टपल / सेट / फ्रोज़ेनसेट / ...?
1948 को smci

जवाबों:


873

आप इस सिंटैक्स का उपयोग कर सकते हैं:

if myItem in list:
    # do something

इसके अलावा, उलटा ऑपरेटर:

if myItem not in list:
    # do something

यह सूचियों, टुपल्स, सेट्स और डिक्ट्स (चेक कीज़) के लिए ठीक है।

ध्यान दें कि यह सूचियों और टुपल्स में एक ओ (एन) ऑपरेशन है, लेकिन सेट और डाइक में एक ओ (1) ऑपरेशन है।


1
सुन्न सरणियों वाली सूची के साथ, क्या यह सुन्न उदाहरणों या संख्यात्मक उदाहरणों के अंदर मूल्यों की जांच करेगा?
डैनियल मोलर

खबरदार! यह मेल खाता है, जबकि यह संभवतः वह है जो आप उम्मीद नहीं करते थे:o='--skip'; o in ("--skip-ias"); # returns True !
एलेक्स एफ

3
@ एलेक्स एफ: क्योंकि मैच ("--skip-ias")टपल नहीं है, लेकिन एक स्ट्रिंग (कोष्ठक कुछ नहीं करते हैं, जैसे (1)कि सिर्फ एक पूर्णांक है)। यदि आप 1-ट्यूपल चाहते हैं, तो आपको एकल आइटम के बाद अल्पविराम जोड़ने की आवश्यकता है: ("--skip-ias",)(या (1,))।
ब्लैंकनथ

ध्यान दें कि यदि आप पात्रों की तुलना कर रहे हैं, तो यह असंवेदनशील है।
टिलसन

65

दूसरे ने जो कहा है, इसके अलावा, आपको यह जानने में भी दिलचस्पी हो सकती है कि विधि inको कॉल करने के लिए क्या है list.__contains__, कि आप अपने द्वारा लिखे गए किसी भी वर्ग को परिभाषित कर सकते हैं और अपने पूर्ण सीमा पर अजगर का उपयोग करने के लिए बेहद आसान हो सकते हैं।  

एक गूंगा उपयोग हो सकता है:

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>>         

5

मैं हाल ही में इस एक लाइनर के साथ आया था कि Trueअगर किसी सूची में किसी वस्तु के घटित होने की संख्या है, या Falseयदि इसमें कोई घटना नहीं है या कुछ भी नहीं है। उपयोग करने next(...)से यह डिफ़ॉल्ट रिटर्न मान ( False) देता है और इसका मतलब है कि यह पूरी सूची समझ को चलाने की तुलना में काफी तेज चलना चाहिए।

list_does_contain = next((True for item in list_to_test if item == test_item), False)


मेरे मामले में मेरे पास श्रेणी नामक एक वस्तु है और केवल संपत्ति लिंक के लिए परीक्षण करने की आवश्यकता है, इसलिए यह समाधान मेरे मामले में बेहतर है।
साभार

3
any(item == test_item for item in list_to_test)मुझे भी लगता है कि काम करेगा?
किसी ने

3

यदि आइटम मौजूद नहीं है, तो सूची विधि indexवापस आ जाएगी -1और यदि यह मौजूद है, तो सूची में आइटम के सूचकांक को वापस कर देगा। वैकल्पिक रूप से एक ifबयान में आप निम्न कार्य कर सकते हैं:

if myItem in list:
    #do things

आप यह भी देख सकते हैं कि क्या तत्व निम्नलिखित कथन के साथ सूची में नहीं है:

if myItem not in list:
    #do things

15
indexविधि वापस नहीं करता है -1 अगर तत्व मौजूद नहीं है, यह एक फेंकता ValueErrorअपवाद।
मोंडिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.