سؤال

أحد هياكل البيانات الأساسية في بايثون هو القاموس، الذي يسمح للشخص بتسجيل "مفاتيح" للبحث عن "قيم" من أي نوع.هل يتم تنفيذ هذا داخليًا كجدول تجزئة؟إذا لم يكن كذلك، فما هو؟

هل كانت مفيدة؟

المحلول

نعم، إنه تعيين تجزئة أو جدول تجزئة.يمكنك قراءة وصف تنفيذ إملاء بايثون، كما كتبه تيم بيترز، هنا.

لهذا السبب لا يمكنك استخدام شيء "غير قابل للتجزئة" كمفتاح للإملاء، مثل القائمة:

>>> 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

أنت تستطيع اقرأ المزيد عن جداول التجزئة أو تحقق من كيفية تنفيذه في بيثون و لماذا يتم تنفيذه بهذه الطريقة.

نصائح أخرى

يجب أن يكون هناك ما هو أكثر في قاموس بايثون من البحث عن جدول في hash().عن طريق التجربة الغاشمة وجدت هذا تصادم التجزئة:

>>> 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

من المحتمل أن يكون هناك مستوى بحث آخر يتجاوز hash() والذي يتجنب الاصطدامات بين مفاتيح القاموس.أو ربما يستخدم dict() تجزئة مختلفة.

(بالمناسبة، هذا في بيثون 2.7.10.نفس القصة في Python 3.4.3 و3.5.0 مع حدوث تصادم عند hash(1.1) == hash(214748749.8).)

نعم.داخليًا، يتم تنفيذه كتجزئة مفتوحة استنادًا إلى متعددة الحدود البدائية على Z/2 (مصدر).

للتوسع في شرح nosklo:

a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top