উত্তর:
in স্পষ্টতই বেশি অজগর।
keys()একটি অনুলিপিের চেয়ে অভিধানে কেবল একটি সেট-মত দৃষ্টিভঙ্গি, সুতরাং x in d.keys()ও (1)। তবুও, x in dআরও পাইথোনিক।
x in d.keys()অবশ্যই একটি অস্থায়ী অবজেক্ট তৈরি এবং ধ্বংস করতে হবে, যা মেমরি বরাদ্দকরণের সাথে সম্পূর্ণ হয়, যেখানে x in d.keys()কেবল একটি পাটিগণিত অপারেশন (হ্যাশ গণনা করা) এবং একটি অনুসন্ধান করা হচ্ছে। দ্রষ্টব্য যে d.keys()এটি কেবল 10 গুণ বেশি দীর্ঘ, যা এখনও সত্যিই দীর্ঘ নয়। আমি চেক করিনি তবে আমি এখনও নিশ্চিত যে এটি কেবল ও (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_keyও (1) এও প্রদর্শিত হবে।
পাইথন ডক্স অনুসারে :
has_key()পক্ষে হ্রাস করা হয়key in d।
has_key()পাইথন 3 এ এখন সরানো হয়েছে
ব্যবহারের dict.has_key()করেন (এবং কেবল যদি) আপনার কোড 2.3 আগের (যখন পাইথন সংস্করণ দ্বারা runnable হতে প্রয়োজন বোধ করা হয় key in dictচালু করা হয়)।
একটি উদাহরণ রয়েছে যেখানে inপ্রকৃতপক্ষে আপনার অভিনয়কে হত্যা করে।
আপনি যদি inও (1) পাত্রে ব্যবহার করেন যা কেবল প্রয়োগ করে __getitem__এবং has_key()তবে __contains__আপনি ও (1) অনুসন্ধানকে ও (এন) অনুসন্ধানে পরিণত করবেন (যেমন inলিনিয়ার অনুসন্ধানে ফিরে আসে )__getitem__ )।
সংশোধন স্পষ্টতই তুচ্ছ:
def __contains__(self, x):
return self.has_key(x)
has_key() জন্য নির্দিষ্ট । in/ __contains__ব্যবহার করার সঠিক API; ঐ পাত্রে যেখানে একটি সম্পূর্ণ স্ক্যান এড়ানো সম্ভব নয় কোন জন্য has_key()পদ্ধতি যাহাই হউক না কেন , এবং যদি সেখানে একটি হে (1) পদ্ধতির তারপর যে ব্যবহার-কেস নির্দিষ্ট সমস্যা জন্য সঠিক ডাটা টাইপ নিতে হবে এবং তাই আপ বিকাশকারীকে দেওয়া হবে।
has_keyঅভিধানের পদ্ধতি, তবে inযে কোনও সংগ্রহে কাজ করবে এবং __contains__অনুপস্থিত থাকা inসত্ত্বেও সংগ্রহটি পুনরুক্তি করার জন্য এটি অনুসন্ধানের জন্য অন্য কোনও পদ্ধতি ব্যবহার করবে।
inউপর পরীক্ষা করা আসলে এটি বেশ দক্ষ range। xrangeযদিও পাইথন 2 তে এর দক্ষতা সম্পর্কে আমি এতটা নিশ্চিত নই । ;)
__contains__তা তুচ্ছভাবে গণনা করতে পারে ।
rangeপ্রতিবার একটি নতুন ইভেন্ট তৈরির ওভারহেড অন্তর্ভুক্ত । একক, প্রাক-বিদ্যমান উদাহরণটি ব্যবহার করে আমার সময়কালে "পূর্ণসংখ্যার পরিসীমা" পরীক্ষা প্রায় 40% দ্রুত হয়।
ডিক.হাস_কি () এর সমাধান অবমাননাকৃত, 'ইন' ব্যবহার করুন - উত্তম পাঠ্য সম্পাদক 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)
পাইথন ৩. এক্স এবং তারপরে চালানোর জন্য এটি নীচে পরিবর্তন করুন:
key = ew
if key not in t
t.has_key(ew)ফেরৎ Trueযদি মান ewরেফারেন্স এছাড়াও অভিধানে একটি চাবিকাঠি। key not in tফেরৎ Trueযদি মান না অভিধানে। তদুপরি, key = ewউপনামটি খুব, খুব নিরর্থক। সঠিক বানানটি হ'ল if ew in t। 8 বছর আগে থেকে গৃহীত উত্তর যা ইতিমধ্যে আপনাকে জানিয়েছে।