Чем отличается множество от списка в питоне
Как и в любом языке программирования в 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, tuple и set? Зачем они нужны?
List (список), tuple (кортеж), set (множество) — это встроенные структуры данных языка python. Каждая из них имеет свои возможности и ограничения. Это позволяет выбрать наиболее подходящий способ хранения информации в программе.
List (список)
Базовая структура данных в python. Элементы в списке хранятся последовательно, каждому из них присвоены индексы, начиная с нуля. В отличие от массива, список может хранить объекты любого типа.
Создание списка
Доступные методы
- my_list.append(x) — добавляет x в конец списка
- my_list.clear() — очищает список
- my_list.copy() — возвращает копию списка my_list
- my_list.count(x) — возвращает кол-во элементов со значением x
- my_list.extend(x) — добавляет элементы списка x к концу списка my_list
- my_list.index(x,start,end) — возвращает индекс первого найденного x, можно задать промежуток для поиска (опционально)
- my_list.insert(index, x) — вставляет x на заданную позицию
- my_list.pop(index) — возвращает элемент с указанным индексом и удаляет его, если индекс не указан — возвращается и удаляется последний элемент
- my_list.remove(x) — удаляет первый элемент со значением x
- my_list.reverse() — инвертирует порядок элементов в списке
- my_list.sort(key=x) сортирует список на основе функции x
В каких случаях использовать?
Для хранения элементов, объединенных каким либо признаком. В случае, если изменение элементов и/или расширение списка не предполагается, следует использовать неизменяемый аналог — кортеж.
Tuple (кортёж)
Кортеж — это неизменяемый и более быстрый аналог списка. Он защищает хранимые данные от непреднамеренных изменений и может использоваться в качестве ключа в словарях (словарь — ассоциативный массив в python).
Создание кортежа.
Доступные методы
- my_tuple.count(x) — возвращает кол-во элементов со значением x
- my_tuple.index(x,start,end) — возвращает индекс первого найденного x, можно задать промежуток для поиска (опционально)
В каких случаях использовать?
Для хранения данных вместо списка (если они не предполагают изменений).
Set (множество)
Множество — это набор уникальных элементов в случайном порядке (неупорядоченный список). Множества примечательны тем, что операция проверки “принадлежит ли объект множеству” происходит значительно быстрее аналогичных операций в других структурах данных.
Создание множества
Доступные методы
- my_set.add(x) — добавляет x во множество
- my_set.difference(x) — возвращает множество элементов my_set, которые не входят во множество x
- my_set.difference_update(x) — удаляет из множества my_set все элементы, которые входят во множество x
- my_set.discard(x) — удаляет элемент x из my_set
- my_set.intersection(x) — возвращает элементы общие для множеств my_set и x
- my_set.intersection_update(x) — удаляет из множества my_set элементы, которых нет во множестве x
- my_set.isdisjoint(x) — возвращает true если my_set и x не содержат одинаковых значений
- my_set.issubset(x) — возвращает true если все элементы my_set входят во множество x
- my_set.issuperset(x) — возвращает true если все элементы x входят во множество my_set
- my_set.pop() — возвращает и удаляет первый (на данный момент) элемент множества
- my_set.remove(x) — удаляет x из множества
- my_set.symmetric_difference(x) — возвращает все элементы из x и my_set, которые встречаются только в одном из множеств
- my_set.symmetric_difference_update(x) — обновляет исходное множество таким образом, что оно будет состоять из всех элементов x и my_set, которые встречаются только в одном из множеств
- my_set.union(x) — возвращает новое множество, состоящее из всех элементов x и my_set
- my_set.update(x) — добавляет в my_set все элементы x
В каких случаях использовать?
Когда необходимо проверять принадлежит ли значение набору уникальных элементов и отсутствует необходимость поддерживать порядок в данном наборе.
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Python для начинающих: какая разница между tuple, list и set?
Язык программирования Python предоставляет четыре встроенных типа данных для хранения коллекций из объектов. Все они наделены различными свойствами и характеристиками: list (список), tuple (кортеж), set (множество) и dictionary (словарь).
В статье обсудим различия между списками, кортежами, множествами и словарями, а также поразмышляем, когда лучше использовать каждый из встроенных типов последовательностей Python.
Примечание: поскольку словарь связывает соответствующие значения с ключами, а это совсем другой сценарий использования по сравнению со списками, множествами и кортежами (которые просто содержат значения), словарь не участвует в обсуждении.
Встроенные типы данных Python для хранения коллекций объектов
Зачем вообще выбирать?
По большей части любая из последовательностей Python применяется на практике без особых проблем, в любом приложении. Однако представьте, что перед вами поставлена легендарная задача найти иголку в стоге сена: какой тип данных Python эффективнее всего справится с такой задачей с точки зрения скорости и памяти?
Может стог сена — это список? Как насчет кортежа? Почему бы не использовать множества всегда? На какие предостережения следует обратить внимание?
Отличия между списком, кортежем и множеством
- Отличие 1: дубликаты.
Говоря проще, List и Tuple в Python как двойняшки разного пола, а тип данных Set для них как двоюродный брат. В отличие от списков или кортежей, множество не содержит дубликатов. Другими словами, элементы множества всегда уникальны. Получается, что множество удобно удаляет дубликаты, словно создано именно для этого.
- Отличие 2: упорядоченность.
Наверняка вы слышали утверждение “множества и словари в Python не упорядочены”, но на сегодняшний день — это лишь половина правды в зависимости от того, какой версией Python вы пользуетесь. До Python версии 3.6 словари и множества действительно не сохраняли порядок элементов, но начиная с Python 3.7, dictionary и set официально упорядочены по времени добавления элементов. А вот list и tuple — это всегда упорядоченные последовательности объектов.
- Отличие 3: индексация.
Что списки, что кортежи — оба поддерживают индексацию и срезы, а вот множества — нет.
Когда выбирать список, а когда — кортеж?
Как упоминалось в руководстве ранее, кортеж — неизменяемый тип данных, тогда как список — изменяемый. Кроме того, размер кортежа фиксированный, а вот размер списка — динамический.
- Список подходит, если:
- Последовательность планируется изменять.
- Планируется постепенно добавлять новые элементы в последовательность или удалять старые.
- Кортеж подходит, если:
- Последовательность НЕ планируется изменять.
- Все, что нужно от последовательности — это возможность поочередно перебирать постоянный набор элементов.
- Нужна последовательность элементов для ее назначения в качестве ключа словаря. Поскольку списки — это изменяемый тип данных, их нельзя применять в качестве ключей словаря.
- Важна скорость выполнения операций с последовательностью: из-за отсутствия возможности изменения, кортежи работают куда быстрее списков.
Когда выбирать множества?
Базовая структура типа данных “множество” — это хеш-таблица (Hash Table). Поэтому множества очень быстро справляются с проверкой элементов на вхождение, например содержится ли объект x в последовательности a_set .
Идея заключается в том, что поиск элемента в хэш-таблице — это операция O(1), то есть операция с постоянным временем выполнения.
Получается, всегда надо использовать множество?
По сути, если не нужно хранить дубликаты, то множество будет лучшим выбором, чем список.
Выводы
“Преждевременная оптимизация — корень всех зол”.
Итак, самое главное, что вам стоит запомнить по поводу списков, кортежей и множеств.
- Если необходимо хранить дубликаты, то выбирайте список или кортеж.
- Если НЕ планируется изменять последовательность после ее создания, то выбирайте кортеж, а не список.
- Если НЕ нужно хранить дубликаты, то воспользуйтесь множеством, так как они значительно быстрее определяют наличие объекта в последовательности.
В конечном итоге, по большей части не стоит слишком сильно задумываться о том, какого же типа данных последовательностью воспользоваться.
Главное — помнить о похожих чертах и особенностях встроенных типов данных Python.
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: индексация.
Что списки, что кортежи — оба поддерживают индексацию и срезы, а вот множества — нет.
Когда выбирать список, а когда — кортеж?
Как упоминалось в руководстве ранее, кортеж — неизменяемый тип данных, тогда как список — изменяемый. Кроме того, размер кортежа фиксированный, а вот размер списка — динамический.
- Список подходит, если:
- Последовательность планируется изменять.
- Планируется постепенно добавлять новые элементы в последовательность или удалять старые.
- Кортеж подходит, если:
- Последовательность НЕ планируется изменять.
- Все, что нужно от последовательности — это возможность поочередно перебирать постоянный набор элементов.
- Нужна последовательность элементов для ее назначения в качестве ключа словаря. Поскольку списки — это изменяемый тип данных, их нельзя применять в качестве ключей словаря.
- Важна скорость выполнения операций с последовательностью: из-за отсутствия возможности изменения, кортежи работают куда быстрее списков.
Когда выбирать множества?
Базовая структура типа данных “множество” — это хеш-таблица (Hash Table). Поэтому множества очень быстро справляются с проверкой элементов на вхождение, например содержится ли объект x в последовательности a_set .
Идея заключается в том, что поиск элемента в хэш-таблице — это операция O(1), то есть операция с постоянным временем выполнения.
Получается, всегда надо использовать множество?
По сути, если не нужно хранить дубликаты, то множество будет лучшим выбором, чем список.
Выводы
“Преждевременная оптимизация — корень всех зол”.
Итак, самое главное, что вам стоит запомнить по поводу списков, кортежей и множеств.
- Если необходимо хранить дубликаты, то выбирайте список или кортеж.
- Если НЕ планируется изменять последовательность после ее создания, то выбирайте кортеж, а не список.
- Если НЕ нужно хранить дубликаты, то воспользуйтесь множеством, так как они значительно быстрее определяют наличие объекта в последовательности.
В конечном итоге, по большей части не стоит слишком сильно задумываться о том, какого же типа данных последовательностью воспользоваться.
Главное — помнить о похожих чертах и особенностях встроенных типов данных Python.