Чем отличаются list, tuple и set? Зачем они нужны?
List (список), tuple (кортеж), set (множество) — это встроенные структуры данных языка python. Каждая из них имеет свои возможности и ограничения. Это позволяет выбрать наиболее подходящий способ хранения информации в программе.
List (список)
Базовая структура данных в python. Элементы в списке хранятся последовательно, каждому из них присвоены индексы, начиная с нуля. В отличие от массива, список может хранить объекты любого типа.
Создание списка
>>> my_list = [] # Создание пустого списка с помощью литерала списка >>> my_list = list() # Создание пустого списка с помощью встроенной функции >>> >>> my_list = [1,2,['a','b'],4,5] # Инициализация списка >>> >>> my_list = list('hello world') # Создание списка из итерируемого объекта >>> my_list ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] >>> >>> my_list = [x for x in range(10)] # Генератор списков в действии >>> my_list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Доступные методы
- 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 = () # Создание кортежа с помощью литерала >>> my_tuple = tuple() # Создание кортежа с помощью встроенной функции >>> >>> my_tuple = (1,2,['a','b'],4,5) # Инициализация кортежа >>> >>> my_tuple = tuple('hello world') # Создание кортежа из итерируемого объекта >>> my_tuple ('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd') >>> >>> my_tuple = tuple(2**x for x in [0, 1, 2, 3]) # Генератор кортежей >>> my_tuple (1, 2, 4, 8)
Доступные методы
- my_tuple.count(x) — возвращает кол-во элементов со значением x
- my_tuple.index(x,start,end) — возвращает индекс первого найденного x, можно задать промежуток для поиска (опционально)
В каких случаях использовать?
Для хранения данных вместо списка (если они не предполагают изменений).
Set (множество)
Множество — это набор уникальных элементов в случайном порядке (неупорядоченный список). Множества примечательны тем, что операция проверки “принадлежит ли объект множеству” происходит значительно быстрее аналогичных операций в других структурах данных.
Создание множества
>>> my_something = > # . Попытка создать множество при помощи литерала даст нам словарь >>> type(my_something) class 'dict'> >>> >>> my_set = set() # Создание при помощи встроенной функции >>> >>> my_set = 1,2,3,4,5> # Инициализация множества >>> >>> my_set = set('hello world') # Создания множества из итерируемого объекта >>> my_set 'r', 'o', 'e', 'h', 'd', 'w', 'l', ' '> >>> >>> my_set = x for x in range(10)> # Генератор множеств >>> my_set 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
Доступные методы
- 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
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
В чем отличие Множеств, списков, массивов?
В чем отличие указателей и массивов на примере strlen()?
Здравствуйте уважаемые форумчаче. Появился вот такой вопрос. Почему функция strlen работает в.
В чем отличие многомерного массива (прямоугольного) от «зубчатых» массивов
Объясните пожалуйста в чем отличие многомерного массива(прямоугольного) от "зубчатых" массивов(т.е.
Отличие пар от списков
Правильно ли я понимаю, что списки от пар отличаются только тем, что в последней ячейке списка.
Пересечение списков-множеств
Здравствуйте, помогите, пожалуйста, решить задачу. Заранее благодарна. Определите функцию.
Регистрация: 02.10.2016
Сообщений: 62
AntonPr, Если в двух словах, то множество в python — «контейнер», содержащий не повторяющиеся элементы в случайном порядке. Списки в python это динамические массивы — упорядоченные изменяемые коллекции объектов произвольных типов у которых нет фиксированного размера.
Регистрация: 08.10.2008
Сообщений: 417

Сообщение было отмечено AntonPr как решение
Решение
В Python, массив это и есть список. Список может быть многомерным, т.е. каждый элемент списка может быть списком, каждый элемент которого, так же может быть списком и т.д. Более того, список может содержать в себе кортежи, словари и даже множества. А множество, это более узкое понятие. Его элементы не могут быть одинаковыми и они не индексируются, т.е. нельзя обратиться к какому-то одному элементу множества. Множества применяются, в основном, для фильтрации и выборки.
Регистрация: 05.11.2018
Сообщений: 55
А в чем тогда смысл использования множеств, если списки лучше, так сказать?
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
AntonPr, чем?
Регистрация: 08.10.2008
Сообщений: 417

Сообщение было отмечено ildwine как решение
Решение
Сообщение от AntonPr 
А в чем тогда смысл использования множеств, если списки лучше, так сказать?
Смысл в том, что только над множествами можно осуществлять такие операции как: объединение, пересечение, разность и т.п.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Пересечение списков-множеств
Здравствуйте, помогите, пожалуйста, решить задачу. Заранее благодарна. Определите функцию.

Объединение списков-множеств
Уже часа два мучаюсь, трудно дается этот язык Определите функцию, на вход которой подаются два.

Пересечение списков-множеств
эта функция должна возвращать список из элементов, которые встречаются в каждом из двух.
Реализовать объединение списков-множеств
Здравствуйте дорогие форумчане! Помогите пожалуйста с задачей: Написать функцию union :: Eq a.

Организовать представление множеств в виде линейных однонаправленных списков
Даны два множества А и В. Организовать представление множеств в виде линейных однонаправленных.
В чем отличие
Господа,наверное, совсем простой для вас вопрос,но я путаюсь чем отличаются эти 2 обозначения?
Структуры данных Python: списки, кортежи, словари, множества

Массивы данных в Python реализованы достаточно своеобразно, что сильно отличает его от других языков программирования. Если вы изучаете Python как второй язык, то его структуры мягко говоря, вызывают недоумение. Если же вы начнёте изучать другой язык после Python’а, то сильно удивитесь отсутствию списков, кортежей, словарей и множеств.
В других языках, да и вообще в программировании, такие структуры называются одним словом: массивы. Но в Python это приводит к путанице, поскольку используя синтаксис массивов, применяются другие названия, а под словом «массив» подразумевается вообще отдельная библиотека. Попробуем разобраться во всех этих хитростях.
Общее понятие массива данных в программировании
Предположим у нас есть несколько клиентов, которые различаются по имени. Без массива пришлось бы сделать примерно так (код на PHP):
$client1 = 'Маша'; $client2 = 'Вася'; $client3 = 'Аня';
Под массивом обычно принимается набор элементов. В большинстве языков для массивов используются квадратные скобки.
$clients = ['Маша', 'Вася', 'Аня'];
Массив предполагает использование индекса смещения. Например, так можно получить первый элемент, у которого нулевое смещение:
print($clients[0]);
Точно также можно изменить элемент, обратившись к нему по индексу.
$clients[1] = 'Петя';
То есть элементы массива представляют собой упорядоченное расположение элементов в памяти.
Есть ещё одна разновидность массивов, которая называется ассоциативным массивом. Он использует пару «ключ-значение».
$client = [ 'name' => 'Маша', 'city' => 'Киев', 'year' => '1998' ];
Чтобы получить значение массива, следует обратиться по его ключу:
print($client['city']);
С массивами, естественно, можно выполнять много разных операций, но, что касается общего описания, то в принципе этого достаточно, чтобы понимать его устройство и назначение.
Отличия Python: список и словарь
Python не использует слово «массив» и это часто вносит путаницу. Вместо этого Python разделяет понятие массива на список (list) и словарь (dict).
Список задаётся точно также, как и обычный массив и с ним можно делать все те же операции:
Clients = ['Маша', 'Вася', 'Аня'] print(Clients[0]) Clients[1] = 'Петя' print(Clients) # ['Маша', 'Петя', 'Аня']
Но список не может быть ассоциативным массивом. Ассоциативный массив в Python — это словарь:
Client = < 'name': 'Маша', 'city': 'Киев', 'year': '1998' >print(Client['city']) # Киев
Обратите внимание, что словарь задаётся уже с помощью фигурных скобок. Если попытаться использовать обычные квадратные, то Python вывалится с ошибкой. Но при этом получение данных массива, всё также происходит с помощью квадратных скобок.
Таким образом первое отличие Python — вместо слова «массив» следует использовать «список» или «словарь», чтобы показать его устройство.
Неизменяемый список — кортеж
Python выделяет особый вид списка, который будет неизменяемым — кортеж (tuple). Если в списке можно изменить любой элемент, то кортеж задаётся только один раз и больше не меняется.
t = ('Маша', 'Вася', 'Аня') t[1] = 'Петя' # TypeError: 'tuple' object does not support item assignment
Для создания кортежа используются уже круглые скобки.
Зачем нужен кортеж? Для меня — это одна из загадок, поскольку для своих задач обычного списка более чем достаточно. Но официальное объяснение — использование там, где требуется постоянное значение хэша — это т.н. неизменяемые объекты. Если мы не планируем операции по изменению элементов, то можно обойтись более простым объектом кортежа, чем список с многочисленными методами.
Если говорить строго, то для задания кортежа не нужны никакие скобки. Это типовой вариант задания кортежа.
t = 'Маша', 'Вася', 'Аня' print(t[1]) # 'Вася'
Но при этом, если мы хотим сделать кортеж с одним элементом, то нужно в конце обязательно добавлять запятую:
t = 'Маша', print(t[0]) # 'Маша'
Если запятую убрать, то мы получим, что переменная содержит обычную строку. Из-за этой особенности, желательно для всех кортежей добавлять запятую в конце перечисления значений.
t = 'Маша', 'Вася', 'Аня',
Поэтому круглые скобки используют только для того, чтобы исключить неопределённость.
Множество set
Ещё одной отличительной чертой Python является набор уникальных элементов множество (set). По своей сути — это тот же словарь, только состоящий из ключей.
st = print(st) #
Множество используется там, где нужно получить уникальные значения. Часто можно встретить задачу, где нужно убрать дубли из списка. Для этого список преобразуется в множество, потом обратно в список:
inElement = [‘planet’, ‘sputnik’, ‘planet’] inElement = list(set(inElement)) print(inElement) #
В других языках для этого используются просто функции, но в Python почему-то требуется преобразование типа «туда-сюда», при котором может измениться последовательность элементов.
Особенностью множества будет то, что в нём элементы хранятся неупорядоченно, то есть нельзя получить элемент по его индексу. Но при этом можно добавить и удалить элемент по ключу.
d1 = d1.add(‘comet’) print(d1) # d1.remove(‘planet’) print(d1) #
Есть разновидность множества — frozenset. В отличие от обычного, его нельзя изменить. Задаётся с помощью одноимённой функции:
fset = frozenset() fset.add(4) # AttributeError: 'frozenset' object has no attribute 'add'
Возникает вопрос зачем вообще нужны множества, если с ними столько нюансов? Дело в том, что Python предлагает много операций над множествами. Это очень похоже на SQL-команды UNION или даже JOIN, где происходит объединение результатов по разным алгоритмам.
# комбинации множеств a = b = # пересечение — элементы в обоих множествах print(a & b) # print(a.intersection(b)) # — или так # объединение print(a | b) # print(a.union(b)) # — или так # разность (те, что в первом, но нет во втором множестве) print(a - b) # print(a.difference(b)) # — или так # исключающие ИЛИ print(a ^ b) # print(a.symmetric_difference(b)) # — или так
Модуль array
Чтобы мы окончательно запутались, Python предлагает ещё и модуль array с помощью которого можно создавать те же списки, только определенного типа данных.
Зачем это нужно? Это некая имитация того, что есть в языках со строгой типизацией. Например в Паскале (Java и многие другие языки) следует указывать из какого типа данных будет состоять массив. Это сделано для того, чтобы можно было определить сколько памяти нужно выделить под переменную.
var a: array[1..10] of integer;
Поскольку в Python динамическая типизация, то сделать подобное можно так:
import array ar = array.array('i', [1, 2, 3, 4, 5])
Дальше работа с происходит с помощью методов модуля array.
Итого
Массивы часто используются в программах. Нужно просто запомнить, что в Python они делятся на разные варианты. В 99% случаев хватает списков и словарей.
Кортежи используются для тех случаев, когда хотят особо обратить внимание, что элементы не требуют изменения. Какого-то принципиального выигрыша (в скорости и памяти) по сравнению со списком не будет, так что это больше относится к стилю программированию.
Множества — самый «капризный» вариант — их следует использовать только там где требуется уникальность элементов. В Python нет нормальной встроенной функции для удаления дублей из списков, поэтому приходится использовать set() . Поэтому кажется, что списки постоянно используются, но нет, это скорее вынужденная мера, чтобы не изобретать свой велосипед или использовать дополнительные модули, вроде itertools.
На собеседованиях часто пытаются проверить знания этих особенностей Python. Например подсовывают код, где пытаться изменить кортеж или получить элемент множества по индексу. Это 100% уловка на внимательность. К реальному программированию это имеет мало отношения — просто достаточно знать особенности массивов Python, чтобы их полноценно использовать.
Операции над множествами — Python: Cловари и множества
Если при изучении множеств остановиться на создании и модифицировании, может показаться, что множества не сильно-то и отличаются от списков. Кажется, что они просто позволяют быстрее проверить вхождение элемента, но при этом не поддерживают механизм срезов.
На самом деле, есть более важные аспекты, которые мы и изучим в этом уроке.
Проверка на равенство
Сопоставление множеств — это довольно мощный инструмент. Давайте проверим два множества на равенство:
set([1, 2, 3, 2, 1]) == 3, 1, 2> # True
Можно подумать, что два множества равны, если каждый отдельный элемент одного множества содержится и во втором. Эта догадка близка к истине, но вспомним, что коллекции в Python хранят только ссылки на объекты. Множества равны, если ссылаются на одни и те же объекты. Одинаковые ссылки равны, но при этом могут быть равны и разные объекты.
Дело в том, что в Python есть специальный протокол проверки на равенство. Большинство встроенных типов данных поддерживает этот протокол. Мы можем проверять на равенство числа, строки, булевы значения. А еще можем приравнивать кортежи, списки, словари.
Здесь Python поступает очень разумно. Если вы приравняете две коллекции одного типа, то эти коллекции будут считаться равными, если их элементы попарно равны с точки зрения протокола. Посмотрите:
[1, 2, ["foo", "bar"]] == [1, 2, ["foo"] + ["bar"]] # True (1, True, []) == (1, True, []) # True "a": 1, "b": 2> == "b": 2, "a": 1> # True
Словари равны, если порядок ключей разный — лишь бы были равны значения по соответствующим ключам и сами наборы ключей были одинаковыми.
Вот и множества равны, если содержат одинаковые наборы равных попарно элементов.
Объединение множеств
По аналогии с множествами в математике, множества в Python поддерживают операцию объединения (union). Эта операция не объединяет множества, а возвращает новый объект.
Этот объект — это такое множество, которое содержит все элементы, содержащиеся хотя бы в одном из оригинальных множеств. По смыслу объединение похоже на операцию «ИЛИ» из булевой логики: элемент будет присутствовать в объединении, если он присутствует в первом исходном множестве ИЛИ во втором. Так это выглядит на схеме:
Для объединения множеств в Python используется оператор | :
visited_by_masha = 'Paris', 'London'> visited_by_kolya = 'Moscow', 'Paris'> visited_by_kolya | visited_by_masha #
Пересечение множеств
Еще есть «операция И» — пересечение множеств (intersection). В пересечение входят элементы, присутствующие в первом из оригинальных множеств И во втором:
В Python оператор пересечения — & :
visited_by_masha = 'Paris', 'London'> visited_by_kolya = 'Moscow', 'Paris'> visited_by_kolya & visited_by_masha #
Разность множеств
Разность множеств (difference) — такое множество, элементы которого содержатся в первом оригинальном множестве, но не содержатся во втором. Разность представлена оператором — , потому что по смыслу оператор похож на вычитание из арифметики:
visited_by_masha = 'Paris', 'London'> visited_by_kolya = 'Moscow', 'Paris'> visited_by_masha - visited_by_kolya # visited_by_kolya - visited_by_masha #
Так разность можно обозначить на схеме:
Симметрическая разность
Симметрическая разность (symmetric difference) — множество, в которое входят элементы, присутствующие ЛИБО в первом, ЛИБО во втором оригинальном множестве:
По смыслу операция похожа на исключающее ИЛИ (xor), поэтому и представлена оператором ^ :
visited_by_masha = 'Paris', 'London'> visited_by_kolya = 'Moscow', 'Paris'> visited_by_kolya ^ visited_by_masha #
Подмножества и надмножества
Одно множество является подмножеством другого (subset), если все элементы первого входят во второе, но второе может содержать еще и другие элементы. Второе в этом случае является надмножеством для первого (superset):
При этом равные множества являются друг для друга одновременно и подмножествами и надмножествами.
В Python соотношение множеств можно проверить с помощью методов issubset и issuperset :
a = 1, 2, 3, 4> b = 3, 4>
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
