पायथन की सूची में कुछ (नहीं) है तो मैं कैसे जांच करूं?
सबसे सस्ता और सबसे पठनीय समाधान 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
पर एक सदस्यता परीक्षण list
O (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
इसलिए त्रुटि ऑपरेटर पूर्वता में से एक नहीं है।