पायथन की सूची में कुछ (नहीं) है तो मैं कैसे जांच करूं?
सबसे सस्ता और सबसे पठनीय समाधान inऑपरेटर (या आपके विशिष्ट मामले में not in) का उपयोग कर रहा है। जैसा कि प्रलेखन में उल्लेख किया गया है,
ऑपरेटरों inऔर not inसदस्यता के लिए परीक्षण। x in sका मूल्यांकन
Trueकरता है, तो xके एक सदस्य है s, और Falseनहीं तो। x not in sकी उपेक्षा लौटाता है x in s।
साथ ही,
ऑपरेटर not inका व्युत्क्रम सही मान होता है in।
y not in xतार्किक रूप में ही है not y in x।
कुछ उदाहरण निम्नलिखित हैं:
'a' in [1, 2, 3]
# False
'c' in ['a', 'b', 'c']
# True
'a' not in [1, 2, 3]
# True
'c' not in ['a', 'b', 'c']
# False
यह भी tuples के साथ काम करता है, क्योंकि tuples hashable (इस तथ्य के परिणामस्वरूप कि वे अपरिवर्तनीय भी हैं):
(1, 2) in [(3, 4), (1, 2)]
# True
यदि RHS पर ऑब्जेक्ट एक __contains__()विधि को परिभाषित करता है , inतो आंतरिक रूप से इसे कॉल करेगा, जैसा कि डॉक्स के तुलना अनुभाग के अंतिम पैराग्राफ में उल्लेख किया गया है ।
... inऔर not inप्रकार से समर्थित हैं जो चलने योग्य हैं या __contains__()विधि को लागू करते हैं
। उदाहरण के लिए, आप ऐसा कर सकते हैं (लेकिन ऐसा नहीं करना चाहिए):
[3, 2, 1].__contains__(1)
# True
inशॉर्ट-सर्किट, इसलिए यदि आपका तत्व सूची की शुरुआत में है, तो inतेजी से मूल्यांकन करता है:
lst = list(range(10001))
%timeit 1 in lst
%timeit 10000 in lst # Expected to take longer time.
68.9 ns ± 0.613 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
178 µs ± 5.01 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
यदि आप किसी आइटम की सूची में है या नहीं, इससे अधिक जांच करना चाहते हैं, तो विकल्प हैं:
list.indexएक आइटम के सूचकांक को पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है। यदि वह तत्व मौजूद नहीं है, तो एक ValueErrorउठाया जाता है।
list.count यदि आप घटनाओं को गिनना चाहते हैं तो इसका उपयोग किया जा सकता है।
XY समस्या: क्या आपने विचार किया है set?
अपने आप से ये सवाल पूछें:
- क्या आपको यह जांचने की आवश्यकता है कि क्या आइटम एक बार से अधिक सूची में है?
- क्या यह जांच लूप के अंदर की गई है, या किसी फ़ंक्शन को बार-बार कहा जाता है?
- क्या वे आइटम जो आप अपनी सूची में धोने योग्य हैं? IOW, क्या आप
hashउन पर कॉल कर सकते हैं?
यदि आपने इन सवालों के "हां" का जवाब दिया है, तो आपको setइसके बजाय उपयोग करना चाहिए । S inपर एक सदस्यता परीक्षण listO (n) समय जटिलता है। इसका मतलब है कि अजगर को आपकी सूची का एक रेखीय स्कैन करना होगा, प्रत्येक तत्व का दौरा करना होगा और इसे खोज आइटम के खिलाफ तुलना करना होगा। यदि आप इसे बार-बार कर रहे हैं, या यदि सूचियाँ बड़ी हैं, तो यह ऑपरेशन ओवरहेड हो जाएगा।
setदूसरी ओर, वस्तुओं ने निरंतर समय की सदस्यता जांच के लिए अपने मूल्यों को हैश किया है। चेक का उपयोग करके भी किया जाता है in:
1 in {1, 2, 3}
# True
'a' not in {'a', 'b', 'c'}
# False
(1, 2) in {('a', 'c'), (1, 2)}
# True
यदि आप काफी दुर्भाग्यशाली हैं कि जिस तत्व को आप खोज रहे हैं / नहीं खोज रहे हैं वह आपकी सूची के अंत में है, तो अजगर ने सूची को अंत तक स्कैन किया होगा। यह नीचे दिए गए समय से स्पष्ट है:
l = list(range(100001))
s = set(l)
%timeit 100000 in l
%timeit 100000 in s
2.58 ms ± 58.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
101 ns ± 9.53 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
एक अनुस्मारक के रूप में, यह एक उपयुक्त विकल्प है जब तक आपके द्वारा संग्रहीत और देख रहे तत्वों को धोने योग्य है। IOW, उन्हें या तो अपरिवर्तनीय प्रकार, या वस्तुओं को लागू करना होगा __hash__।
3 -1 > 0 and (4-1 , 5) not in []thatTrueइसलिए त्रुटि ऑपरेटर पूर्वता में से एक नहीं है।