Чем множество отличается от списка в питоне
Перейти к содержимому

Чем множество отличается от списка в питоне

  • автор:

Python для начинающих: какая разница между tuple, list и set?

Язык программирования Python предоставляет четыре встроенных типа данных для хранения коллекций из объектов. Все они наделены различными свойствами и характеристиками: list (список), tuple (кортеж), set (множество) и dictionary (словарь).

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

Примечание: поскольку словарь связывает соответствующие значения с ключами, а это совсем другой сценарий использования по сравнению со списками, множествами и кортежами (которые просто содержат значения), словарь не участвует в обсуждении.

Зачем вообще выбирать?

По большей части любая из последовательностей Python применяется на практике без особых проблем, в любом приложении. Однако представьте, что перед вами поставлена легендарная задача найти иголку в стоге сена: какой тип данных Python эффективнее всего справится с такой задачей с точки зрения скорости и памяти?

Может стог сена — это список? Как насчет кортежа? Почему бы не использовать множества всегда? На какие предостережения следует обратить внимание?

Отличия между списком, кортежем и множеством

  • Отличие 1: дубликаты.
    Говоря проще, List и Tuple в Python как двойняшки разного пола, а тип данных Set для них как двоюродный брат. В отличие от списков или кортежей, множество не содержит дубликатов. Другими словами, элементы множества всегда уникальны. Получается, что множество удобно удаляет дубликаты, словно создано именно для этого.
  • Отличие 2: упорядоченность.
    Наверняка вы слышали утверждение “множества и словари в Python не упорядочены”, но на сегодняшний день — это лишь половина правды в зависимости от того, какой версией Python вы пользуетесь. До Python версии 3.6 словари и множества действительно не сохраняли порядок элементов, но начиная с Python 3.7, dictionary и set официально упорядочены по времени добавления элементов. А вот list и tuple — это всегда упорядоченные последовательности объектов.
  • Отличие 3: индексация.
    Что списки, что кортежи — оба поддерживают индексацию и срезы, а вот множества — нет.

Когда выбирать список, а когда — кортеж?

Как упоминалось в руководстве ранее, кортеж — неизменяемый тип данных, тогда как список — изменяемый. Кроме того, размер кортежа фиксированный, а вот размер списка — динамический.

  • Список подходит, если:
  1. Последовательность планируется изменять.
  2. Планируется постепенно добавлять новые элементы в последовательность или удалять старые.
  • Кортеж подходит, если:
  1. Последовательность НЕ планируется изменять.
  2. Все, что нужно от последовательности — это возможность поочередно перебирать постоянный набор элементов.
  3. Нужна последовательность элементов для ее назначения в качестве ключа словаря. Поскольку списки — это изменяемый тип данных, их нельзя применять в качестве ключей словаря.
  4. Важна скорость выполнения операций с последовательностью: из-за отсутствия возможности изменения, кортежи работают куда быстрее списков.

Когда выбирать множества?

Базовая структура типа данных “множество” — это хеш-таблица (Hash Table). Поэтому множества очень быстро справляются с проверкой элементов на вхождение, например содержится ли объект x в последовательности a_set .

Идея заключается в том, что поиск элемента в хэш-таблице — это операция O(1), то есть операция с постоянным временем выполнения.

Получается, всегда надо использовать множество?

По сути, если не нужно хранить дубликаты, то множество будет лучшим выбором, чем список.

Выводы

“Преждевременная оптимизация — корень всех зол”.

Итак, самое главное, что вам стоит запомнить по поводу списков, кортежей и множеств.

  1. Если необходимо хранить дубликаты, то выбирайте список или кортеж.
  2. Если НЕ планируется изменять последовательность после ее создания, то выбирайте кортеж, а не список.
  3. Если НЕ нужно хранить дубликаты, то воспользуйтесь множеством, так как они значительно быстрее определяют наличие объекта в последовательности.

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

Главное — помнить о похожих чертах и особенностях встроенных типов данных Python.

Чем множество отличается от списка в питоне

Как и в любом языке программирования в Python существует несколько типов структур данных, это:

Списки

Это динамическая структура данных, которая может хранить объекты разнородных типов с произвольным доступом к элементам (на самом деле он последовательный, но мы можем получить доступ к любому элементу по его индексу). Индексация элементов списка начинается с нуля. Из операций над списками, на начальном этапе достаточно знать и уметь добавлять элементы в список и удалять их из него.

Создание объекта списка происходит так:

добавление и удаление элемента в/из списка происходит следующим образом:

Надо сказать, что все операции так называемые in place, то есть в результате ничего не возвращается и новый список не создается.

Чтобы добавить несколько элементов в список можно использовать оператор + , как в строке 2 B = B + [ 1 , 2 , 3 , 4 , 5 ] , тогда если изначальный список был B = [ 0 , 5 ] , то посте операции он станет B = [ 0 , 5 , 1 , 2 , 3 , 4 , 5 ] . Важно!! если вы используете B . append ([ 1 , 2 , 3 , 4 , 5 ]) , то получите B = [ 0 , 5 ,[ 1 , 2 , 3 , 4 , 5 ]] , то есть добавите список как объект в список. Чтобы результат был идентичен, вместо append нужно использовать extend: B . extend ([ 1 , 2 , 3 , 4 , 5 ]) .

Также список поддерживает методы очистки clear () и сортировки sort () .

Срез списка задается в формате A[N:M], при этом элемент с номером N включается в срез, а M — нет.

Для проверки наличия элемента в списке существует оператор in , пример:

Пример «список четных чисел»

Создадим список, содержащий все четные числа от нуля до некоторого N

Массивы

Масивы в python подобны спискам, за исключением того, что хранят элементы одного и того же типа (basic type). Тип массив (array) реализован в пакете array, для его использования, сначала нужно его импортировать.

Конструктор массивов имеет формат:

array . array ( typecode ,[ initializer ])

typecode — один из типов Типы

На 64-битной машине размер элементов в байтах будет следующим

Type code C Type Python type Minimum size in bytes
‘b’ signed char int 1
‘B’ unsigned char int 1
‘u’ Py_UNICODE Unicode character 2
‘h’ signed short int 2
‘H’ unsigned short int 2
‘i’ signed int int 4
‘I’ unsigned int int 4
‘l’ signed long int 8
‘L’ unsigned long int 8
‘q’ signed long long int 8
‘Q’ unsigned long long int 8
‘f’ float float 4
‘d’ double float 8

Массивы поддерживают те же операции, что и списки

Кортежи

Кортежем или tuple называется неизменяемый список. Создается он следующим образом:

И соответственно кортеж не поддерживает операции добавления, сортировки, вставки, удаления, расширения. Среди поддерживаемых операций — конкатенация

Здесь стоит отметить, что в отличие от списка, где новый элемент просто добавляется в конец, происходит создание нового объекта.

Для кортежей доступ к элементу и выполнение срезов эквивалентно спискам, отсутствует лишь возможность изменять кортеж.

Для проверки наличия элемента в кортеже все аналогично спискам.

Словари

Словари или ассоциативные массивы — это еще один способ представления данных, отличие словаря от списка в том, что индексами могут быть не только целые числа, но и любые объекты Python. В случае индексов — любые hashable объекты.

Создать ассоциативный массив просто:

Чтобы поместить значение в ассоциативный массив, достаточно присвоить значение выбранному индексу, например B [ 10 ] = ‘Hello’ или B [ «12» ] = 12 .

Из этих примеров видно, что индекс может быть действительно любым объектом, равно как и присваиваемое значение.

У словаря есть два важных метода: keys() и values() . Первый возвращает список ключей, второй — список значений.

В случае словаря B , при вызове B.keys() мы получим [10, «12»] , а при вызове B.values() — [‘Hello’, 12]

Важно

При добавлении элементов в список, кортеж или словарь имейте ввиду, для atomic (immutable) и basic типов, создается ссылка на новый объект и помещается в словарь, для остальных объектов в словарь помещается ссылка на существующий объект. Если он в дальнейшем изменяется, то изменяется и содержимое словаря, кортежа, списка.

Как видите, изменение ссылочного объекта вне словаря/списка/кортежа ведет к изменению его в словаре/списке/кортеже

Множества

Это динамическая структура, содержащая уникальные значения. Множество может содержать лишь hashable объекты. Определяется так:

Поддерживает все операции над множествами: включение, исключение, пересечение, объединение.

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

Или в задачах где заведомо требуется уникальность каждого элемента в списке.

С помощью множества (точнее преобразования списка во множество) можно удалить дубликаты из исходной последовательности:

Чем множество отличается от списка в питоне

List: Lists are just like dynamic sized arrays, declared in other languages (vector in C++ and ArrayList in Java). Lists need not be homogeneous always which makes it the most powerful tool in Python. The main characteristics of lists are –

  • The list is a datatype available in Python which can be written as a list of comma-separated values (items) between square brackets.
  • List are mutable .i.e it can be converted into another data type and can store any data element in it.
  • List can store any type of element.

Example:

Python3

Output:

Tuple: Tuple is a collection of Python objects much like a list. The sequence of values stored in a tuple can be of any type, and they are indexed by integers. Values of a tuple are syntactically separated by ‘commas’. Although it is not necessary, it is more common to define a tuple by closing the sequence of values in parentheses. The main characteristics of tuples are –

  • Tuple is an immutable sequence in python.
  • It cannot be changed or replaced since it is immutable.
  • It is defined under parenthesis().
  • Tuples can store any type of element.

Example:

Python3

Output:

Set: In Python, Set is an unordered collection of data type that is iterable, mutable, and has no duplicate elements. The major advantage of using a set, as opposed to a list, is that it has a highly optimized method for checking whether a specific element is contained in the set. The main characteristics of set are –

Python Sets vs Lists

In Python, which data structure is more efficient/speedy? Assuming that order is not important to me and I would be checking for duplicates anyway, is a Python set slower than a Python list?

Mantas Vidutis's user avatar

10 Answers 10

It depends on what you are intending to do with it.

Sets are significantly faster when it comes to determining if an object is present in the set (as in x in s ), but its elements are not ordered so you cannot access items by index as you would in a list. Sets are also somewhat slower to iterate over in practice.

You can use the timeit module to see which is faster for your situation.

danijar's user avatar

28% greater (slower) than iterating lists

Lists are slightly faster than sets when you just want to iterate over the values.

Sets, however, are significantly faster than lists if you want to check if an item is contained within it. They can only contain unique items though.

It turns out tuples perform in almost exactly the same way as lists, except for their immutability.

Iterating

Determine if an object is present

Set wins due to near instant ‘contains’ checks: https://en.wikipedia.org/wiki/Hash_table

List implementation: usually an array, low level close to the metal good for iteration and random access by element index.

Set implementation: https://en.wikipedia.org/wiki/Hash_table, it does not iterate on a list, but finds the element by computing a hash from the key, so it depends on the nature of the key elements and the hash function. Similar to what is used for dict. I suspect list could be faster if you have very few elements (< 5), the larger element count the better the set will perform for a contains check. It is also fast for element addition and removal. Also always keep in mind that building a set has a cost !

NOTE: If the list is already sorted, searching the list could be quite fast on small lists, but with more data a set is faster for contains checks.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *