В чем разница между хэшем Ruby и словарем Python?

в 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 и словарем в Python?

3 ответов


и Руби хэш и словарь Python представляют собой карта абстрактный тип данных (ADT)

.. ассоциативный массив, карта, таблица символов, или словарь-это абстрактный тип данных, состоящий из коллекция пар (ключ, значение), так что каждый возможный ключ появляется не более одного раза в коллекции.

кроме того, как хэш, так и словарь реализованы как хэш Таблицы, которые требуют, чтобы ключи не hashable и equatable. Вообще говоря, операции вставки, удаления и выборки в хэш-таблице являются O(1) амортизированными или "быстрыми, независимыми от размера хэша/Дикта".

[хэш-таблица] - это структура данных, используемая для реализации ассоциативного массива, структура, которая может сопоставлять ключи со значениями. хэш-таблица использует хэш-функцию для вычисления индекса в массиве ведер или слотов, из которых правильное значение может быть найдено.

(реализации карт, использующие деревья, в отличие от хэш-таблиц, находятся в контекстах постоянного и функционального программирования.)

конечно, есть также различия между вариантами дизайна Ruby и Python и конкретными реализациями карт по умолчанию:

  • поведение по умолчанию при поиске отсутствующего ключа:nil на Hash, кроме dict1
  • вставка-заказ гарантии: гарантировано в Hash (начиная с Ruby 2.0), нет гарантии в dict (до Python 3.6)1
  • возможность указать генератор значений по умолчанию:Hash только1
  • возможность использования основных изменяемых типов (например. списки) как ключи:Hash только2
  • синтаксис, используемый для литералов Hash / dict и т. д..

на [] синтаксическая поддержка является общей, поскольку оба языка обеспечивают синтаксическую сахар для перегруженного оператора индекса, но реализуется по-разному и имеет разную семантику в случае отсутствия ключей.


1 Python содержит defaultdict и OrderedDict реализации, а также которые имеют различное поведение / функциональность от стандартного dict. Эта реализация позволяет генераторам значений по умолчанию, обработке отсутствующих ключей и дополнительным гарантиям заказа, которые не найдены в стандарте dict тип.

2 некоторые основные типы в Python (например. list и dict) явно отклонить хэширование и, следовательно, они не могут использоваться в качестве ключей в словаре, основанном на хэшировании. Это не совсем разница dict себя и можно по-прежнему использовать изменяемые пользовательские типы в качестве ключей, хотя в большинстве случаев это не рекомендуется.


они (словарь на Python, хэш в Ruby) идентичны для всех практических целей и реализуют общий Dictionary / Hashtable (хранилище ключей), где вы обычно храните запись с уникальным ключом и получаете быстро поиск его значения.


теперь ruby также поддерживает следующие sysntax:

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

но тогда мы должны получить доступ к значениям по обозначению символа:

residents[:Puffin]