Ruby Hash和Python字典有什么区别?

时间:2014-05-09 23:46:28

标签: python ruby dictionary hashmap

在Python中,有词典:

residents = {'Puffin' : 104, 'Sloth' : 105, 'Burmese Python' : 106}

在Ruby中,有哈希:

residents = {'Puffin' => 104, 'Sloth' => 105, 'Burmese Python' => 106}

唯一的区别是:=>语法。 (注意,如果示例使用变量而不是字符串,那么就没有语法差异。)

在Python中,您可以通过键调用字典的值:

residents['Puffin']
# => 104

在Ruby中,您也可以通过键获取哈希值:

residents['Puffin']
# => 104

它们看起来是一样的。

Ruby中的Hash和Python中的字典有什么区别?

3 个答案:

答案 0 :(得分:11)

Ruby's HashPython's dictionary都代表Map Abstract Data Type (ADT)

  

..关联数组,映射,符号表或字典是由(键,值)对的集合组成的抽象数据类型,这样每个可能的键在集合中最多出现一次

此外,Hash和字典都实现为Hash Tables,这要求密钥可以清除和等同。一般来说,哈希表上的插入和删除以及获取操作都是O(1)摊销或快速,独立于散列/字典大小"。

  

[哈希表]是用于实现关联数组的数据结构,关联数组可以将键映射到值。 哈希表使用哈希函数来计算桶或槽数组的索引,从中可以找到正确的值

(使用Trees的地图实现,而不是哈希表,可以在持久化和函数式编程上下文中找到。)

当然,Ruby和Python设计选择以及提供的特定/默认Map实现之间也存在差异:

  • 缺失密钥查找的默认行为:nil中的Hashdict 1 中的例外
  • 插入排序保证:Hash保证(自Ruby 2.0起),dict无法保证(直到Python 3.6) 1
  • 能够指定默认值生成器:Hash 1
  • 能够使用核心可变类型(例如列表)作为键:Hash 2
  • 用于Hash / dict Literals等的语法。

[]语法支持是常见的,因为两种语言都为重载索引运算符提供语法糖,但是在下面实现不同,并且在缺少键时具有不同的语义。


1 Python还提供defaultdictOrderedDict实现,它们具有与标准dict不同的行为/功能。这些实现允许默认值生成器,缺失键处理以及标准dict类型中未找到的其他排序保证。

2 Python中的某些核心类型(例如listdict)明确拒绝可散列,因此它们不能用作基于的字典中的键散列。这并不是dict本身的差异,并且仍然可以使用可变自定义类型作为键,尽管在大多数情况下不鼓励这样做。

答案 1 :(得分:8)

他们(Python中的字典,Ruby中的哈希)对于所有实际目的都是相同的,并实现了一般Dictionary / Hashtable(一个键 - 值存储),您通常存储给定唯一键的条目,并获取<强>快查找它的值。

答案 2 :(得分:5)

现在ruby还支持以下sysntax:

residents = {'Puffin': 104, 'Sloth': 105, 'Burmese Python': 106}

但是我们应该用符号表示法来访问值:

residents[:Puffin]