Разница между 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