जवाबों:
in निश्चित रूप से अधिक पायथोनिक है।
keys()एक प्रतिलिपि के बजाय एक शब्दकोश में एक सेट जैसा दृश्य है, इसलिए x in d.keys()O (1) है। फिर भी, x in dअधिक पायथोनिक है।
x in d.keys()यह निर्माण करना चाहिए और एक अस्थायी वस्तु को नष्ट करना चाहिए, जो कि आवंटित स्मृति आवंटन के साथ पूरा होता है, जहां x in d.keys()सिर्फ एक अंकगणितीय ऑपरेशन (हैश की गणना) और एक लुकअप कर रहा है। ध्यान दें कि d.keys()यह केवल लगभग 10 गुना लंबा है, जो अभी भी वास्तव में लंबा नहीं है। मैंने जाँच नहीं की है लेकिन मुझे अभी भी पूरा यकीन है कि यह केवल O (1) है।
in न केवल लालित्य में (और नहीं पदावनत;; बल्कि प्रदर्शन में भी, जैसे:
$ python -mtimeit -s'd=dict.fromkeys(range(99))' '12 in d'
10000000 loops, best of 3: 0.0983 usec per loop
$ python -mtimeit -s'd=dict.fromkeys(range(99))' 'd.has_key(12)'
1000000 loops, best of 3: 0.21 usec per loop
हालांकि निम्नलिखित अवलोकन हमेशा सच नहीं होता है, आप देखेंगे कि आमतौर पर , पायथन में, तेज समाधान अधिक सुरुचिपूर्ण और पायथन है; यही कारण -mtimeitहै कि एसओ मददगार है - यह सिर्फ यहाँ और वहाँ सौ नैनोसेकंड बचाने के बारे में नहीं है ! -)
has_keyO (1) भी प्रतीत होता है।
अजगर डॉक्स के अनुसार :
has_key()के पक्ष में पदावनत किया जाता हैkey in d।
has_key()अब Python 3
dict.has_key()अगर (और केवल अगर) का उपयोग करें तो आपके कोड को 2.3 से पहले पायथन संस्करणों द्वारा चलाया जा सकता है (जब key in dictपेश किया गया था)।
एक उदाहरण है जहां in वास्तव में आपके प्रदर्शन को मारता है।
यदि आप inएक O (1) कंटेनर का उपयोग करते हैं, जो केवल लागू करता है __getitem__और has_key()नहीं __contains__तो आप O (N) खोज में O (1) खोज को चालू कर देंगे (जैसा inकि रैखिक खोज में वापस आता है )__getitem__ )।
फिक्स स्पष्ट रूप से तुच्छ है:
def __contains__(self, x):
return self.has_key(x)
has_key()है अजगर 2 शब्दकोशों के लिए विशिष्ट । in/ __contains__उपयोग करने के लिए सही एपीआई है; उन कंटेनरों के लिए जहां एक पूर्ण स्कैन अपरिहार्य है , वैसे भी कोई has_key()विधि नहीं है , और यदि कोई ओ (1) दृष्टिकोण है, तो वह उपयोग-केस विशिष्ट होगा और इसलिए समस्या के लिए सही डेटा प्रकार चुनने के लिए डेवलपर तक।
has_keyएक शब्दकोश विधि है, लेकिन inकिसी भी संग्रह पर काम करेगा, और यहां तक __contains__कि लापता होने पर, inपता लगाने के लिए संग्रह को पुनरावृत्त करने के लिए किसी अन्य विधि का उपयोग करेगा।
inपर परीक्षण करना वास्तव में काफी कुशल है range। मैं अजगर 2 पर इसकी दक्षता के बारे में इतना निश्चित नहीं हूं xrange, हालांकि। ;)
__contains__तुच्छ गणना कर सकते हैं।
rangeहर बार एक नया उदाहरण बनाने का ओवरहेड शामिल है। एकल, पहले से मौजूद उदाहरण का उपयोग करके "समयावधि में पूर्णांक" परीक्षण मेरे समय में लगभग 40% तेज है।
तानाशाही का समाधान। Is_key () पदावनत किया जाता है, 'में' का प्रयोग करें - उदात्त पाठ संपादक 3
यहाँ मैंने 'युग' नाम के शब्दकोष का एक उदाहरण लिया है -
ages = {}
# Add a couple of names to the dictionary
ages['Sue'] = 23
ages['Peter'] = 19
ages['Andrew'] = 78
ages['Karren'] = 45
# use of 'in' in if condition instead of function_name.has_key(key-name).
if 'Sue' in ages:
print "Sue is in the dictionary. She is", ages['Sue'], "years old"
else:
print "Sue is not in the dictionary"
एडम पार्किन की टिप्पणियों के साथ एलेक्स मार्टेली के प्रदर्शन परीक्षणों पर विस्तार ...
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 301, in main
x = t.timeit(number)
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 178, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
d.has_key(12)
AttributeError: 'dict' object has no attribute 'has_key'
$ python2.7 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0872 usec per loop
$ python2.7 -mtimeit -s'd=dict.fromkeys(range(1999))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0858 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d'
10000000 loops, best of 3: 0.031 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d'
10000000 loops, best of 3: 0.033 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d.keys()'
10000000 loops, best of 3: 0.115 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d.keys()'
10000000 loops, best of 3: 0.117 usec per loop
यदि आपके पास ऐसा कुछ है:
t.has_key(ew)
पायथन 3. एक्स और इसके बाद के संस्करण पर चलने के लिए इसे नीचे बदलें:
key = ew
if key not in t
t.has_key(ew)रिटर्न Trueअगर मूल्य ewसंदर्भ भी शब्दकोश में एक कुंजी है। यदि मान डिक्शनरी में नहीं है तो key not in tलौटाता Trueहै । इसके अलावा, उपनाम बहुत ही बेमानी है। सही वर्तनी है । जो पहले से बताए गए 8 साल से स्वीकृत जवाब है। key = ewif ew in t