tl; dr (duck-typing)
Вы правы, когда видите некоторые сходства во всех этих структурах данных. Помните, что в python используется тип "утка" (если он выглядит как утка и крякает как утка, значит, это утка).Если вы можете использовать два объекта в одной и той же ситуации, то для ваших текущих намерений и целей они также могут быть одного типа данных.Но вы всегда должны помнить, что если вы попытаетесь использовать их в других ситуациях, они могут больше не вести себя одинаково.
Имея это в виду, мы должны взглянуть на то, что на самом деле отличается и одинаковоо четырех упомянутых вами типах данных, чтобы получить общее представление о ситуациях, когда они взаимозаменяемы.
Изменчивость (можете ли вы ее изменить?)
Вы можете вносить изменения в словари, списки,и устанавливает.Кортежи не могут быть «изменены» без создания копии.
Python string
также является неизменяемым типом.Почему мы хотим некоторые неизменные объекты?Я бы перефразировал из этот ответ:
Неизменяемые объекты можно оптимизировать много
В Python,только неизменяемые объекты являются хэшируемыми (и только хэшируемые объекты могут быть членами наборов или ключами в словарях).
При сравнении этого свойства списки и кортежи кажутся "ближайшими"два типа данных.На высоком уровне кортеж является неизменяемой версией списка в виде стоп-кадра.Это делает списки полезными для наборов данных, которые будут меняться с течением времени (поскольку вам не нужно копировать список, чтобы изменить его), но кортежи полезны для таких вещей, как словарные ключи (которые должны быть неизменяемого типа).
Упорядочение (и примечание по абстрактным типам данных)
Словарь, как и набор, не имеет внутреннего концептуального порядка.Это в отличие от списков и кортежей, которые имеют порядок.Порядок элементов в dict или множестве составляет абстрагированный от программиста, что означает, что если элемент A предшествует B в цикле for k in mydata
, вы не должны (и вообще не может) полагаться на существо A до B, как только вы начнете вносить изменения в mydata
.
Сохранение заказа: list
, tuple
Сохранение без заказа: dict
, set
Технически, если вы повторяете mydata
дважды подряд, это будет в том же порядке, но это более удобная особенность механики python, а на самом деле не является частью set
* 1068.* абстрактный тип данных (математическое определение типа данных).Списки и кортежи действительно гарантируют порядок, особенно кортежи, которые являются неизменяемыми.
То, что вы видите, когда выполняете итерацию (если она идет как утка ...)
One«элемент» на «элемент»: set
, list
, tuple
Два «элемента» на «элемент»: dict
IПредположим, что здесь можно увидеть именованный кортеж, который имеет как имя, так и значение для каждого элемента, как неизменный аналог словаря.Но это незначительное сравнение - имейте в виду, что типирование утки вызовет проблемы, если вы попытаетесь использовать метод только из словаря для именованного кортежа или наоборот.
Прямые ответы на ваши вопросы
Разве словарь не является просто списком кортежей с определенным ограничением уникальности?
Нет, есть несколько отличий.Словари не имеют собственного порядка, который отличается от списка, который имеет.
Кроме того, словарь имеет ключ и значение для каждого "элемента".С другой стороны, кортеж может иметь произвольное количество элементов, но каждый из которых содержит только значение.
Из-за механики словаря, в котором ключи действуют как набор, вы можете искать значения впостоянное время, если у вас есть ключ.В списке кортежей (пар здесь) вам нужно будет перебирать список до тех пор, пока вы не найдете ключ, то есть поиск будет линейным по количеству элементов в вашем списке.
Самое главное, однако, элементы словаря могут быть изменены, а кортежи - нет.
Разве список - это не просто набор с уникальной уникальностью?
ограничение
Опять же, я бы подчеркнул, что наборы не имеют внутреннего порядка, а списки - нет. Это делает списки гораздо более полезными для представления таких вещей, как стеки и очереди, где вы хотите иметь возможность помнить порядок, в котором вы добавляли элементы. Наборы не дают такой гарантии. Тем не менее, они предлагают преимущество в том, что могут выполнять поиск членов в постоянное время, в то время как списки занимают линейное время.
Теперь есть именованные кортежи - они начинают больше походить на специальный словарь. Теперь есть упорядоченные словари, которые начинают больше походить на список. И я только что увидел рецепт заказанных наборов. Я могу представить, что это происходит и продолжается ... как насчет уникальных списков и т. Д.
В какой-то степени я согласен с вами. Однако библиотеки структур данных могут быть полезны для поддержки общих сценариев использования для уже хорошо зарекомендовавших себя структур данных. Это позволяет программисту не тратить время на попытки найти собственные расширения стандартных структур. Пока это не выходит из-под контроля, и мы по-прежнему видим уникальную полезность в каждом решении, хорошо иметь колесо на полке, поэтому нам не нужно его изобретать заново.
Отличным примером является класс Counter (). Этот специализированный словарь был полезен мне больше раз, чем я могу сосчитать (badoom-tshhhhh!), И он спас меня от усилий по написанию собственного решения. Я бы предпочел иметь решение, которое сообщество помогает мне разрабатывать и придерживаться надлежащих лучших практик Python, а не того, что хранится в моей папке пользовательских структур данных и используется только один или два раза в год.