পাইথন অভিধান হ্যাশ টেবিলের উদাহরণ?


187

পাইথনের প্রাথমিক ডেটা স্ট্রাকচারগুলির মধ্যে একটি হ'ল অভিধান, যা কোনও ধরণের "মান" সন্ধানের জন্য "কী" রেকর্ড করতে দেয়। এটি কি হ্যাশ টেবিল হিসাবে অভ্যন্তরীণভাবে প্রয়োগ করা হয়েছে? যদি না হয়, এটা কি?


2
আপনি যদি প্রযুক্তিগত বিবরণে আগ্রহী হন, সুন্দর কোডের একটি নিবন্ধ পাইথনের dictবাস্তবায়নের অভ্যন্তরীণ বিষয়গুলি নিয়ে আলোচনা করে ।
টর্স্টেন মেরেক

এটি সুন্দর কোডের আমার প্রিয় একটি অধ্যায় ছিল।
ডিজিেন্ট্রি

4
পাইথন অভিধান কীভাবে কাজ করে তা নিয়ে ব্র্যান্ডন ক্রেগ রোডসের একটি আলোচনা এখানে রয়েছে, youtube.com/watch?v=C4Kc8xzcA68
চান্ডোলা

আমি কিছু সময়ের জন্য ডিকের প্রতিনিধিত্ব করে এমন একটি চিত্রের সন্ধান করলাম, যা স্মৃতি এবং সিপাইটিতে বাস্তবায়নকে বাতিল করে দেয়। বইটি উল্লেখ করার জন্য ধন্যবাদ!
চেন এ।

উত্তর:


239

হ্যাঁ, এটি হ্যাশ ম্যাপিং বা হ্যাশ টেবিল। যেমন, টিম পিটার্স দ্বারা লিখিত আপনি পাইথন এর অভি বাস্তবায়ন একটি বিবরণ পড়তে পারেন এখানে

এজন্য আপনি কোনও তালিকার মতো ডিক কী হিসাবে 'হ্যাশেবল নয়' এমন কিছু ব্যবহার করতে পারবেন না:

>>> a = {}
>>> b = ['some', 'list']
>>> hash(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>> a[b] = 'some'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable

আপনি হ্যাশ টেবিলগুলি সম্পর্কে আরও পড়তে পারেন বা কীভাবে অজগরটিতে এটি প্রয়োগ করা হয়েছে এবং কেন সেভাবে প্রয়োগ করা হয় তা পরীক্ষা করতে পারেন


1
টিম পিটার্স লিংক সিমগুলি ভেঙে ফেলার জন্য, সেখানে কি কোনও পরিষ্কার লিঙ্ক আছে?
ম্যাট অ্যালকক

1
@ ম্যাটআলকক: আমি লিঙ্কটি আপডেট করেছি। কখনও কখনও (সাধারণত কেউ নিজের ইমেল ঠিকানাটি কোথাও কোথাও সরিয়ে নিতে চায়) ফলে অজগর তালিকার সংরক্ষণাগারগুলি পুনরায় তৈরি করা হয় এবং ইমেলের আইডিগুলি পরিবর্তিত হয়, এইভাবে এই লিঙ্কগুলি ভেঙে দেয়। পাইডটর্গ অ্যাডমিনরা সাধারণত আজকাল তা এড়াতে চেষ্টা করে।
মার্টিজান পিটারস

তবে ব্যবহার করে .keys()কীগুলির একটি তালিকা পুনরুদ্ধার করতে পারে। একটি আসল হ্যাশ টেবিলটি কীগুলি সঞ্চয় করে না, কেবল স্থান বাঁচানোর জন্য হ্যাশগুলি রাখে।
noɥʇʎԀʎzɐɹƆ

পাইথন ডিক বাস্তবায়নের আরও সম্পূর্ণ বিবরণ এখানে: লরেন্টলস.com
ড্যানিয়েল গোল্ডফার্ব

32

হ্যাশ () তে টেবিল দেখার চেয়ে পাইথন অভিধানে আরও কিছু থাকতে হবে। নিষ্ঠুর পরীক্ষা-নিরীক্ষার মাধ্যমে আমি এই হ্যাশের সংঘর্ষের বিষয়টি পেয়েছি :

>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438

তবুও এটি অভিধান ভাঙে না:

>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'

বৈধতা পরীক্ষা:

>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438

সম্ভবত হ্যাশ () এর বাইরে অন্য দেখার স্তর রয়েছে যা অভিধান কীগুলির মধ্যে সংঘর্ষ এড়ায়। অথবা ডিক () একটি ভিন্ন হ্যাশ ব্যবহার করে।

(উপায় দ্বারা, এই পাইথন 2.7.10 হবে। একই সময়ে একটি সংঘর্ষের সঙ্গে পাইথন 3.4.3 এবং 3.5.0 গল্প hash(1.1) == hash(214748749.8)।)


14
সুতরাং সংঘর্ষগুলি অনিবার্য। সেট এসটিতে সীমাহীন বিশাল সংখ্যক আইটেম থাকতে পারে এবং আপনি এটি কম্পিউটারে সঞ্চয় করতে পারেন এমন কোনও সংখ্যায় হ্যাশ করতে চান। একটি হ্যাশ টেবিলের প্রতিটি ব্যবহারযোগ্য প্রয়োগ সংঘর্ষের সমাধান করে, খুব ঘন ঘন দুটি পদ্ধতি হ'ল ক) উন্মুক্ত ঠিকানা এবং খ) চেইন। কেবলমাত্র এটি একটি নিখুঁত হ্যাশ ব্যবহার করে না তার অর্থ এটি হ্যাশ টেবিল নয়।
TurnipEntropy

1
সংঘর্ষগুলি সাধারণভাবে ঘটবে, কারণ এখানে অসীম সম্ভাব্য হ্যাশযোগ্য মান এবং সসীম হ্যাশ কোড রয়েছে। এমনকি একটি হ্যাশ টেবিলকে কোনওভাবে সংঘর্ষ পরিচালনা করতে হবে।
ইয়ানফেং লিউ

3
@ ইয়ানফেংলিয়ু আমি বিশ্বাস করি টার্নিপ এন্ট্রপির তৈরি একই পয়েন্টগুলি।
বব স্টেইন

1
পাইথন ৩.7-তে, দেখে মনে হচ্ছে বাস্তবে 2E20 বিয়োগ 1 সম্ভাব্য হ্যাশ মান রয়েছে। -1E20 বিয়োগ 1 থেকে (+) 1E20 বিয়োগ 1 টি চেষ্টা করুন hash('I wandered lonely as a cloud, that drifts on high o\'er vales and hills, when all at once, I saw a crowd, a host of golden daffodils.')এটি একটি 19-সংখ্যার দশমিক দেয় - -4037225020714749784যদি আপনি যত্নের পক্ষে যথেষ্ট বুদ্ধিমান হন। বাচ্চাদের নিজের কথায় চালিয়ে যান, এবং হ্যাশটি এখনও 19-সংখ্যার নম্বর। আমি ধরে নিই যে পাইথনে আপনি স্ট্রিংয়ের দৈর্ঘ্যের সীমাবদ্ধতা রাখতে পারেন তবে সম্ভাব্য মানের চেয়ে আরও অনেকগুলি সম্ভাব্য স্ট্রিং বলা নিরাপদ। এবং hash(False)= 0 উপায় দ্বারা।
ক্রোকসফোর্ড

22

হ্যাঁ. অভ্যন্তরীণভাবে এটি জেড / 2 ( উত্স ) এর ওপরে আদিম বহুবর্ষের ভিত্তিতে ওপেন হ্যাশিং হিসাবে প্রয়োগ করা হয় ।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.