В чем разница между хэшем 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
, кромеdict
1 - вставка-заказ гарантии: гарантировано в
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]