Python字典是哈希表的一个例子吗?

时间:2008-09-22 13:22:29

标签: python hash dictionary hashmap hashtable

Python中的一个基本数据结构是字典,它允许用户记录“键”以查找任何类型的“值”。这在内部实现为哈希表吗?如果没有,那是什么?

5 个答案:

答案 0 :(得分:207)

是的,它是一个哈希映射或哈希表。您可以阅读Tim Peters撰写的python dict实现的描述,here

这就是为什么你不能使用'nothable'作为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

您可以read more about hash tablescheck how it has been implemented in pythonwhy it is implemented that way

答案 1 :(得分:22)

Python字典必须比hash()上的表查找更多。通过粗暴的实验,我发现了这个哈希冲突

<!--hidden when normal screen-->
<div id="hidden-arrows" class="col-sm-12 col-xs-12">
<div class="col-sm-6 col-xs-6">
<span id="back-text" style="z-index:9999999;">Back</span><span>Next</span>
<script type="text/javascript">
$(document).ready(function(){
 $('#back-text').click(function(){
   alert();
 });
});
</script>

但它并没有打破字典:

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

完整性检查:

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

可能还有另一个超出hash()的查找级别,可以避免字典键之间的冲突。或者dict()可能使用不同的哈希值。

(顺便说一句,这在Python 2.7.10中。在Python 3.4.3和3.5.0中的相同故事,在>>> for k,v in d.items(): print(hash(k)) 2040142438 2040142438 发生冲突。)

答案 2 :(得分:20)

是。在内部,它基于Z / 2(source)上的本原多项式实现为开放散列。

答案 3 :(得分:6)

扩展nosklo的解释:

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

答案 4 :(得分:-1)

我想指出字典是一个哈希表,但不是相反。

在字典中,您只能存储相同类型的对象,例如。你可以有一个字典,其中的值都是字符串或值都是整数。 例如,您不能拥有一个值是整数而另一个值是浮点数的字典。

然而,使用 Python 并没有太大区别,因为您没有显式声明数据类型。