Разница между списком, последовательностью и срезом в Python? - PullRequest
22 голосов
/ 27 мая 2010

В чем различия между этими встроенными типами данных Python: список , последовательность и срез ? На мой взгляд, все три по существу представляют то, что C ++ и Java называют массив .

Ответы [ 5 ]

42 голосов
/ 27 мая 2010

Вы смешиваете очень разные вещи в своем вопросе, поэтому я просто отвечу на другой вопрос; -P

Теперь вы спрашиваете об одном из самых важных интерфейсов в Python: iterable - это в основном все, что вы можете использовать, например for elem in iterable.

iterable имеет трех потомков: sequence, generator и mapping.

  • A последовательность - это итерация с произвольным доступом. Вы можете запросить любой элемент последовательности без необходимости потреблять элементы до него. С помощью этого свойства вы можете создать slices, который даст вам более одного элемента одновременно. Срез может дать вам подпоследовательность: seq[from:until] и каждый n-й элемент: seq[from:until:nth]. list, tuple и str все являются последовательностями.

  • Если доступ осуществляется с помощью клавиш вместо целочисленных позиций, у вас есть отображение . dict является основным отображением.

  • Самым базовым итерируемым является генератор . Он не поддерживает произвольный доступ и, следовательно, не разрезает. Вы должны потреблять все предметы в том порядке, в котором они даны. Генератор обычно создает свои элементы только тогда, когда вы перебираете их. Распространенным способом создания generators являются выражения генератора. Они выглядят точно так же, как и списки, за исключением круглых скобок, например (f(x) for x in y). Вызов функции, использующей ключевое слово yield, также возвращает генератор.

Общим адаптером для всех итераций является итератор . iterators имеют тот же интерфейс, что и самый базовый тип, который они поддерживают, generator. Они создаются явно путем вызова iter для итерируемого и неявно используются во всех видах циклических конструкций.

11 голосов
/ 27 мая 2010
  • list - больше, чем простые массивы.Вы можете инициализировать их без указания количества элементов.Вы можете append / push к ним, вы можете remove / pop / del элементов из них, вы можете иметь списки различных типов объектов (например, [1,'e', [3]]), вы можете иметь рекурсивныесписки ... и вы можете нарезать списки, что означает получение нового списка только с несколькими элементами.
  • slice - это тип объекта, используемый "за кулисами" для обработки расширенной нарезки в a[start:stop:step] форма, как показывает help(slice).

«Последовательность» - это не объект, более похожий на неформальный интерфейс некоторых объектов, таких как list реализовать.

5 голосов
/ 27 мая 2010

Список - это последовательность, но последовательность не обязательно является списком. Последовательность - это любой тип, который поддерживает интерфейс последовательности («протокол»). Это делается с помощью Duck-typing, а не с помощью строгой иерархии наследования. Обратите внимание, что последовательности являются контейнерами, но контейнеры не обязательно являются последовательностями. (последовательности, ну, последовательно!)

См. http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrange

Объекты среза обычно создаются неявно с помощью синтаксического сахара (foo[2:5]) и предоставляются специальным методам типа контейнера (например, __getitem__), которые можно переопределить. Как правило, вам не придется иметь дело со слайсами, если только вы не создадите свои собственные последовательности / контейнеры.

См. http://docs.python.org/reference/datamodel.html#specialnames

Списки сопоставимы с массивами. Я не уверен, но я думаю, что он реализован в cPython как динамически расширяемый массив. Тем не менее, интерфейс делает его таким, что он больше похож на вектор C ++ STL, чем на простой старый массив.

5 голосов
/ 27 мая 2010
  • списки являются типом последовательности, подобным массиву

  • последовательность типы описывают функциональный надмножество:

Существует шесть типов последовательностей: строки, строки Unicode, списки, кортежи, буферы и объекты xrange.

  • ломтики являются обозначениями для подмассивов (или также подстрок)

Подробнее ... http://docs.python.org/glossary.html

2 голосов
/ 27 мая 2010

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

Списки отличаются от массивов C ++ тем, что они неоднородны; элементы не обязательно должны быть одного типа. И, как уже указывал MYYN, «sequence» вообще не является типом Python, а скорее описанием различных встроенных типов.

...