Разница между dict и set (питон)

Итак, я знаю, что это,

a = {}  # dict

Создает пустой словарь. Теперь я также понял, что это,

b = {1, 2, 3}  # set

Создает набор. Это легко проверить, так как

>>>print(type(a))
<class 'dict'>

>>>print(type(b))
<class 'set'>

Хотя я понимаю, что он делает, я не понимаю, почему мы используем один и тот же синтаксис для наборов и словарей. Я попытался найти дополнительную информацию о логике этого в set а также dict разделы руководства, но, к сожалению, я ничего не получил от этого.

Может ли кто-нибудь объяснить мне, почему мы делаем это таким образом? Это по историческим причинам, или я упускаю что-то явно очевидное?

4 ответа

Решение

В Python 2 не было заданных литералов, исторически фигурные скобки использовались только для словарей. Наборы могут быть получены из списков (или любых итераций):

set([1, 2, 3])
set([i for i in range(1, 3)])

Python 3 представил набор литералов и пониманий (см. PEP-3100), который позволяет избежать промежуточных списков:

{1, 2, 3}
{i for i in range(1, 3)}

Пустая форма набора, однако зарезервированная для словарей для обратной совместимости. Проверьте ссылки из PEP-3100, то есть здесь: [Python-3000] устанавливает в P3K?

Я уверен, что мы можем что-то решить --- Я согласен, {} для пустого набора и {:} для пустого dict было бы идеально, если бы не обратная совместимость. Мне понравилась идея "специального пустого объекта", когда я впервые написал PEP (т.е. {} быть чем-то, что может превратиться либо в сет, либо в диктат), но один из преподавателей убедил меня, что это приведет к путанице в умах новичков (а также к боли в реализации).

Следующее сообщение описывает эти правила лучше:

Я думаю, что у Гвидо было лучшее решение. использование set() для пустых наборов используйте {} для пустых слов используйте {genexp} для набора пониманий / отображений используйте {1,2,3} для явного набора литералов и использования {k1:v1, k2:v2} для буквальных букв. Мы всегда можем добавить {/} позже, если спрос превышает отвращение.

Синтаксис не тот же. В словарях вначале используются фигурные скобки, и вы указываете пары ключ-значение, где ключ и значение разделяются двоеточием:

>>> {'foo': 'bar'}
{'foo': 'bar'}
>>> type(_)
<type 'dict'>

Наборы были добавлены к языку позже, и {..} в фигурных скобках используются только имена элементов, а не пар:

>>> {'foo'}
set(['foo'])
>>> type(_)
<type 'set'>

Обратите внимание, что в Python 2 интерпретатор отображает объект, используя set() отозваны. Это также, как вы указываете пустой набор:

>>> emptyset = set()

В Python 3 новее {..} нотация используется при отображении объекта, если он не пустой:

>>> {'foo'}
{'foo'}
>>> _ - {'foo'}  # difference, removing the one element
set()

set() Тип был добавлен в язык Python в версии 2.4 (см. PEP 218), синтаксис фигурных скобок для заданных литералов был добавлен в Python 3 и перенесен в Python 2.7.

Дело в том, что {} используется для пустого словаря, а не для пустого набора имеет в значительной степени исторические причины. Синтаксис {'a': 100, 'b': 200} для словарей существует с самого начала Python. Синтаксис {1, 2, 3} для наборов был введен в Python 2.7. поскольку {} использовался так долго, что останется способом определения пустого словаря. Если бы Python имел новый синтаксис набора с самого начала, скорее всего, пустой набор был бы определен с {} и пустой словарь с {:},

Набор — это неупорядоченная коллекция. Словарь — это неупорядоченная коллекция данных, которая хранит данные в виде пар ключ-значение. Словари и наборы используют хеш-таблицы для выполнения поиска и вставки O(1). Документация по структурам данных: https://docs.python.org/3/tutorial/datastructures.html

Другие вопросы по тегам