web-dev-qa-db-ja.com

Python辞書はハッシュテーブルの例ですか?

Pythonの基本的なデータ構造の1つは辞書です。これにより、任意のタイプの「値」を検索するための「キー」を記録できます。これはハッシュテーブルとして内部的に実装されていますか?そうでない場合、それは何ですか?

161
Tommy Herbert

はい、ハッシュマッピングまたはハッシュテーブルです。ティムピーターズによって書かれた、Pythonのdict実装の説明を読むことができます here

そのため、リストのような「ハッシュできない」ものを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

ハッシュテーブルの詳細を読む または pythonでの実装方法を確認する および そのように実装する理由 .

209
nosklo

Python辞書には、hash()でのテーブルルックアップ以上のものが必要です。野bruな実験により、私はこれを見つけましたハッシュ衝突

>>> 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()は別のハッシュを使用する場合があります。

(ところで、これはPython 2.7.10。にありますPython 3.4.3および3.5.0に同じストーリーがあり、hash(1.1) == hash(214748749.8)に衝突します。)

24
Bob Stein

はい。内部的には、Z/2上の原始多項式に基づくオープンハッシュとして実装されます( source )。

20
Ben Hoffstein

Noskloの説明を拡張するには:

a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[Tuple(b)] = 'some' # this will, same as a['some', 'list']
6
Jeremy Cantrell