Ruby Hash 和 Python 字典有啥区别?

Posted

技术标签:

【中文标题】Ruby Hash 和 Python 字典有啥区别?【英文标题】:What is the difference between a Ruby Hash and a Python dictionary?Ruby Hash 和 Python 字典有什么区别? 【发布时间】:2014-06-27 20:13:03 【问题描述】:

在 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 中的字典有什么区别?

【问题讨论】:

可能想要编辑您的标题以读取哈希 vs 字典而不是列表 vs 字典 好吧,你去...哈哈 同样的事情。在java 中是HashMap。一般来说,这个集合系列只是由哈希表支持的任何内容。 在 Ruby 中,不是residents = 'Puffin'=>104, 'Sloth'=>105, 'Burmese Python'=>106吗?即,=>: 分隔键和值? 您对 Ruby 的哈希描述无效。那时,Ruby 和 Python 已经不同了(至少在表示法上)。 【参考方案1】:

Ruby's Hash 和 Python's dictionary 都代表 Map Abstract Data Type (ADT)

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

此外,哈希和字典都实现为Hash Tables,这要求键是可散列和可等价的。一般来说,对哈希表的插入、删除和提取操作是 O(1) 摊销或“快速,独立于哈希/字典大小”。

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

(使用树而不是哈希表的映射实现存在于持久化和函数式编程上下文中。)

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

缺少键查找的默认行为:Hash 中的 nildict 中的异常1 插入排序保证:在Hash 中保证(自 Ruby 2.0 起),在dict 中不保证(直到 Python 3.6)1 能够指定默认值生成器:仅限Hash1 能够使用核心可变类型(例如列表)作为键:仅限Hash2 用于 Hash/dict Literals 等的语法。

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


1 Python 提供了defaultdictOrderedDict 实现,它们的行为/功能与标准dict 不同。这些实现允许在标准 dict 类型中找不到默认值生成器、缺失键处理和额外的排序保证。

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

【讨论】:

【参考方案2】:

它们(Python 中的字典,Ruby 中的哈希)在所有实际用途中都是相同的,并且实现了一个通用的 Dictionary / Hashtable(键值存储),您通常在给定唯一键的情况下存储一个条目,并获得 快速查找它的价值。

【讨论】:

【参考方案3】:

现在 ruby​​ 还支持以下 sysntax:

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

但是我们应该通过符号表示法访问值:

residents[:Puffin]

【讨论】:

以上是关于Ruby Hash 和 Python 字典有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Python中列表和字典有啥区别,分别适用于啥

列表和字典有啥区别?

window.location.hash 和 location.hash 有啥区别? [复制]

Ruby Hash 和 ActiveSupport HashWithIndifferentAccess 的区别

Ruby 1.8 和 Ruby 1.9 有啥区别

python中列表和元组之间有啥区别?