क्या पायथन डिक्शनरी हैश टेबल का उदाहरण है?


187

पायथन में बुनियादी डेटा संरचनाओं में से एक शब्दकोश है, जो किसी भी प्रकार के "मूल्यों" को देखने के लिए "कुंजी" रिकॉर्ड करने की अनुमति देता है। क्या यह आंतरिक रूप से हैश टेबल के रूप में लागू किया गया है? यदि नहीं, तो यह क्या है?


2
यदि आप तकनीकी विवरण में रुचि रखते हैं, तो सुंदर कोड में एक लेख पायथन के dictकार्यान्वयन के आंतरिक मामलों से संबंधित है।
टॉरस्टेन मर्क

वह सुंदर कोड में मेरे पसंदीदा अध्यायों में से एक था।
DGentry

4
यहां ब्रैंडन क्रेग रोड्स द्वारा एक चर्चा की गई है कि अजगर शब्द कैसे काम करता है, youtube.com/watch?v=C4Kc8xzcA68
चंदोला

मैंने कुछ समय के लिए एक तानाशाह का प्रतिनिधित्व करने वाले एक आरेख की तलाश की, जो स्मृति और सीपीथॉन में कार्यान्वयन को डिक्रिप्ट करता है। पुस्तक को संदर्भित करने के लिए धन्यवाद!
चेन ए।

जवाबों:


239

हां, यह हैश मैपिंग या हैश टेबल है। के रूप में, टिम पीटर्स ने लिखा आप, अजगर के dict कार्यान्वयन का एक विवरण पढ़ सकते हैं यहाँ

इसीलिए आप एक सूची की तरह एक तानाशाही कुंजी के रूप में 'नॉट हैशेबल' का उपयोग नहीं कर सकते हैं:

>>> 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
@MattAlcock: मैंने लिंक को अपडेट कर दिया है। कभी-कभी (आमतौर पर किसी व्यक्ति को अपना ईमेल पता कहीं और निकालने के कारण) अजगर सूची अभिलेखागार को फिर से बनाया जाता है और ईमेल की आईडी बदल जाती है, इस प्रकार इन लिंक को तोड़ दिया जाता है। Pydotorg व्यवस्थापक आमतौर पर इन दिनों से बचने की कोशिश करते हैं।
मार्टिन पीटर्स

लेकिन उपयोग .keys()करने से चाबियों की एक सूची प्राप्त हो सकती है। एक असली हैश टेबल कीज़ को स्टोर नहीं करेगा, अंतरिक्ष को बचाने के लिए सिर्फ हैश।
no --zɐɹƆ


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
तो टकराव अपरिहार्य हैं। सेट S में असीम रूप से बड़ी संख्या में आइटम हो सकते हैं, और आप यह चाहते हैं कि एक हैश को वह संख्या जो कंप्यूटर स्टोर कर सकता है। हैश टेबल का हर प्रयोग करने योग्य कार्यान्वयन टकरावों को हल करता है, जिनमें से दो सबसे लगातार तरीके हैं) एक खुला पता और बी) जंजीर। सिर्फ इसलिए कि यह एक सही हैश का उपयोग नहीं करता है इसका मतलब यह नहीं है कि यह एक हैश तालिका नहीं है।
शलजमप्रांतीय

1
टकराव सामान्य रूप से होगा, क्योंकि अनंत संभव धोने योग्य मूल्य और परिमित हैश कोड हैं। यहां तक ​​कि हैश टेबल को किसी तरह टकराव से निपटना होगा।
यानफेंग लियू

3
@YanfengLiu मेरा मानना ​​है कि वे बिल्कुल एक ही बिंदु हैं TurnipEntropy बनाया है।
बॉब स्टेन

1
पायथन 3.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 वैसे।
क्रॉफर्ड


7

नोस्क्लो के स्पष्टीकरण पर विस्तार करने के लिए:

a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.