Python: Set/Frozenset (Множество)
Множество (класс set) — это контейнер, который содержит уникальные не повторяющиеся элементы в случайном порядке (неупорядоченная коллекция).
Что значит неупорядоченная? Это значит, что два множества эквивалентны, если содержат одинаковые элементы.
Элементы множества должны быть уникальными, множество не может содержать одинаковых элементов. Добавление элементов, которые уже есть в множестве, не изменяет это множество.
Для множеств используются фигурные скобки, как у словарей. Достаточно перечислить элементы в скобках.
mySet = # выводится в любом случайном порядке print(mySet) #
Но таким способом нельзя создать пустое множество, вместо него будет создан пустой словарь.
wrong_empty_set = <> print(type(wrong_empty_set)) #
Для создания пустого множества нужно непосредственно использовать set():
correct_empty_set = set() print(type(correct_empty_set)) #
Также в set() можно передать какой-либо объект, по которому можно пройтись (Iterable):
color_list = ["red", "green", "green", "blue", "purple", "purple"] color_set = set(color_list) print(color_set) # порядок может быть другим #
Число элементов вычисляется через len().
Существует ограничение, что элементами множества (как и ключами словарей) в Python могут быть только так называемые хешируемые (Hashable) объекты. Это обусловлено тем фактом, что внутренняя реализация set основана на хеш-таблицах. Например, списки и словари – это изменяемые объекты, которые не могут быть элементами множеств. Большинство неизменяемых типов в Python (int, float, str, bool, и т.д.) – хешируемые. Неизменяемые коллекции, например tuple, являются хешируемыми, если хешируемы все их элементы.
Проверить принадлежит ли какой-либо объект множеству можно с помощью оператора in.
tremendously_huge_set = if "green" in tremendously_huge_set: print("Green is there!") else: print("Unfortunately, there is no green. ")
Множество удобно использовать для удаления повторяющихся элементов. Создадим список с элементами, которые повторяются по несколько раз и сконвертируем его во множество. На этот раз множество создадим через метод set().
words = ['a', 'a', 'b', 'b', 'c', 'd', 'e'] mySet = set(words) print(str(mySet))
colors = for color in colors: print(color)
Два множества называются равными, если они состоят из одних и тех же элементов, порядок этих элементов не важен. Обратите внимание, что состав множеств отличается, но тем не менее они одинаковы (см. начало статьи).
my_cats = your_cats = print(my_cats == your_cats) # True
Если два множества не имеют общих элементов, то говорят, что эти множества не пересекаются и пересечение этих множеств является пустым множеством.
even_numbers = odd_numbers = # Очевидно, что множества чётных и нечётных чисел не пересекаются if even_numbers.isdisjoint(odd_numbers): print("Множества не пересекаются!") # Множества не пересекаются!
Подмножество множества S – это такое множество, каждый элемент которого является также и элементом множества S. Множество S в свою очередь является надмножеством исходного множества.
# Множество чисел Фибоначчи меньших 100 fibonacci_numbers = # Множество натуральных чисел меньших 100 natural_numbers = set(range(100)) # Множество чисел Фибоначчи является подмножеством множества # натуральных чисел if fibonacci_numbers.issubset(natural_numbers): print("Подмножество!") # Вывод: Подмножество! # В свою очередь множество натуральных чисел является # надмножеством множества чисел Фибоначчи if natural_numbers.issuperset(fibonacci_numbers): print("Надмножество!") # Вывод: Надмножество!
Пустое множество является подмножеством абсолютно любого множества. Само множество является подмножеством самого себя.
Другие методы: ‘clear’ (очистка множества), ‘copy’, ‘pop’ (удаляет первый элемент из множества. Так как множества не упорядочены, нельзя точно сказать, какой элемент будет первым), ‘remove’, ‘update’, ‘__bases__’, ‘__contains__’, ‘add’, ‘difference’, ‘difference_update’, ‘discard’, ‘intersection’ (пересечение), ‘intersection_update’, ‘isdisjoint’ (истина, если set и other не имеют общих элементов), ‘issubset’, ‘issuperset’, ‘symmetric_difference’, ‘symmetric_difference_update’, ‘union’ (объединение нескольких множеств).
У множеств можно находить объединение или пересечение элементов.
Объединение множеств – это множество, которое содержит все элементы исходных множеств. В Python есть несколько способов объединить множества.
my_fruits = your_fruits = # Для объединения множеств можно использовать оператор `|`, # оба операнда должны быть объектами типа set our_fruits = my_fruits | your_fruits print(our_fruits) # Вывод (порядок может быть другим): # Также можно использовать метод union. # Отличие состоит в том, что метод union принимает не только # объект типа set, а любой iterable-объект you_fruit_list: list = list(your_fruits) our_fruits: set = my_fruits.union(you_fruit_list) print(our_fruits) # Вывод (порядок может быть другим):
Добавление элементов в множество можно рассматривать как частный случай объединения множеств за тем исключением, что добавление элементов изменяет исходное множество, а не создаёт новый объект.
colors = # Метод add добавляет новый элемент в множество colors.add("purple") # Добавление элемента, который уже есть в множестве, не изменяет # это множество colors.add("red") print(colors) # Вывод (порядок может быть другим): # Метод update принимает iterable-объект (список, словарь, генератор и т.п.) # и добавляет все элементы в множество numbers = numbers.update(i**2 for i in [1, 2, 3]) print(numbers) # Вывод (порядок может быть другим):
Пересечение множеств – это множество, в котором находятся только те элементы, которые принадлежат исходным множествам одновременно.
def is_prime(number: int) -> bool: """ Возвращает True, если number - это простое число """ assert number > 1 return all(number % i for i in range(2, int(number**0.5) + 1)) def is_fibonacci(number: int) -> bool: """ Возвращает True, если number - это число Фибоначчи """ assert number > 1 a, b = 0, 1 while a + b
Разность двух множеств – это множество, в которое входят все элементы первого множества, не входящие во второе множество.
i_know: set = you_know: dict = < "Go": 0.4, "C++": 0.6, "Rust": 0.2, "Java": 0.9 ># Обратите внимание, что оператор `-` работает только # для объектов типа set you_know_but_i_dont = set(you_know) - i_know print(you_know_but_i_dont) # Вывод (порядок может быть другим): # Метод difference может работать с любым iterable-объектом, # каким является dict, например i_know_but_you_dont = i_know.difference(you_know) print(i_know_but_you_dont) # Вывод:
Удаление элемента из множества можно рассматривать как частный случай разности, где удаляемый элемент – это одноэлементное множество. Следует отметить, что удаление элемента, как и в аналогичном случае с добавлением элементов, изменяет исходное множество.
fruits = # Удаление элемента из множества. Если удаляемого элемента # нет в множестве, то ничего не происходит fruits.discard("orange") fruits.discard("pineapple") print(fruits) # Вывод (порядок может быть другим): # Метод remove работает аналогично discard, но генерирует исключение, # если удаляемого элемента нет в множестве fruits.remove("pineapple") # KeyError: "pineapple"
Симметрическая разность множеств – это множество, включающее все элементы исходных множеств, не принадлежащие одновременно обоим исходным множествам. Также симметрическую разность можно рассматривать как разность между объединением и пересечением исходных множеств.
non_positive = non_negative = # Обратите внимание, что оператор `^` может применяться # только для объектов типа set non_zero = non_positive ^ non_negative print(non_zero) # Вывод (порядок может быть другим):
Как видно из примера выше, число 0 принадлежит обоим исходным множествам, и поэтому оно не входит в результирующее множество. Для операции симметрической разности, помимо оператора ^, также существует два специальных метода – symmetric_difference и symmetric_difference_update. Оба этих метода принимают iterable-объект в качестве аргумента, отличие же состоит в том, что symmetric_difference возвращает новый объект-множество, в то время как symmetric_difference_update изменяет исходное множество.
non_positive = non_negative = range(4) non_zero = non_positive.symmetric_difference(non_negative) print(non_zero) # Вывод (порядок может быть другим): # Метод symmetric_difference_update изменяет исходное множество colors = colors.symmetric_difference_update(["green", "blue", "yellow"]) print(colors) # Вывод (порядок может быть другим):
frozenset
frozenset — это неизменяемое множество.
Методы: ‘__name__’, ‘copy’, ‘__bases__’, ‘__contains__’, ‘difference’, ‘intersection’, ‘isdisjoint’, ‘issubset’, ‘issuperset’, ‘symmetric_difference’, ‘union’.
Создадим два разных типа множества, сравним их и попытаемся добавить новые элементы.
setCat = set('кот') frozenCat = frozenset('кот') print(setCat == frozenCat) print(type(setCat)) # set print(type(frozenCat)) #frozenset setCat.add('э') # можем добавить print(setCat) frozenCat.add('e') # эта строка вызовет ошибку при компиляции
Что такое set в Python?
Множества также схожи с массивами, но есть несколько отличий:
- Во-первых, множества создаются в абсолютно случайном порядке каждый раз. Вы можете разместить элементы как вам будет угодно, но они все равно будут расположены впоследствии в случайном порядке.
- Во-вторых, множества не могут иметь повторяющихся элементов, поэтому все элементы, которые будут одинаковыми не будут выведены повторно.
Их очень удобно использовать, если вы хотите удалить повторяющиеся элементы из списка, например:
some_list = [12, 56, 91, 12] set(some_list) # Результат: 12, 56, 91
Также для существует огромное множество операций, которые приведены ниже:
Что такое set
Объект Set позволяет хранить уникальные значения любого типа, будь то примитивы или ссылки на объекты.
Описание
Объекты «Set» — это коллекция значений. Значение в Set может встречаться только один раз; оно уникально в коллекции. Вы можете перебирать элементы набора в порядке вставки. Порядок вставки соответствует порядку, в котором каждый элемент был успешно вставлен в коллекцию методом add() (то есть, когда был вызван add() , в наборе ещё не было такого элемента).
Спецификация требует реализации наборов, «которые в среднем обеспечивают время доступа, сублинейное количеству элементов в коллекции». Следовательно, он может быть представлен внутренне в виде хэш-таблицы (с поиском O(1)), дерева поиска (с поиском O(log(N))) или любой другой структуры данных, при условии, что сложность выше, чем O(N).
Сравнение значений
При добавлении нового элемента в Set происходит проверка, добавлялся ли такой элемент ранее. Эта проверка использует специальный алгоритм сравнения значений SameValueZero. (Раньше использовался алгоритм SameValue, в котором значения 0 и -0 считаются разными. Смотрите браузерную поддержку ниже). Это означает, что NaN считается равным NaN (не смотря на то что NaN !== NaN ), а все другие значения считаются равными в соответствии с семантикой оператора === .
Производительность
Метод has проверяет наличие значения в Set используя алгоритм, который в среднем работает быстрее поэлементного перебора добавленных ранее элементов. В частности этот алгоритм работает быстрее чем метод [ Array.prototype.includes ](/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/includes на массиве, который хранит столько же элементов сколько сравниваемый объект Set .
Конструктор
Создаёт новый объект Set .
Статические свойства
Функция-конструктор, которая используется для создания производных объектов.
Свойства экземпляра
Начальное значение @@toStringTag свойства — строка «Set» . Это значение используется в Object.prototype.toString() .
Возвращает количество значений в объекте Set .
Методы экземпляра
- Set.prototype.add()
- : Вставляет новый элемент с указанным значением в объект Set , если в Set ещё нет элемента с таким же значением.
- : Удаляет все значения из объекта Set .
- : Удаляет элемент, связанный с переданным значением, и возвращает логическое значение, подтверждающее, был ли элемент успешно удалён или нет. Set.prototype.has(value) впоследствии вернет false .
- : Возвращает логическое значение, утверждающее, присутствует ли элемент с заданным значением в объекте Set или нет.
- : Возвращает новый объект итератора, который выдает значения для каждого элемента в объекте Set в порядке вставки.
- : Возвращает новый объект итератора, который выдает значения для каждого элемента в объекте Set в порядке вставки.
- : Аналог Set.prototype.values() .
- : Возвращает новый объект итератора, который содержит массив [value, value] для каждого элемента в объекте Set в порядке вставки.
- : Вызывает callbackFn один раз для каждого значения, присутствующего в объекте Set в порядке вставки. Если указан параметр thisArg , он будет использоваться в качестве значения this для каждого вызова callbackFn .
Примеры
Использование объекта Set
const mySet1 = new Set(); mySet1.add(1); // Set(1) mySet1.add(5); // Set(2) mySet1.add(5); // Set(2) mySet1.add("текст"); // Set(3) const o = a: 1, b: 2 >; mySet1.add(o); mySet1.add( a: 1, b: 2 >); // o ссылается на другой объект, так что это нормально mySet1.has(1); // true mySet1.has(3); // false, поскольку 3 не был добавлен в набор mySet1.has(5); // true mySet1.has(Math.sqrt(25)); // true mySet1.has("Текст".toLowerCase()); // true mySet1.has(o); // true mySet1.size; // 5 mySet1.delete(5); // удаляет элемент 5 из set mySet1.has(5); // false, 5 был удалён mySet1.size; // 4, поскольку мы удалили одно значение mySet1.add(5); // Set(5) < 1, "текст", , , 5 > - ранее удаленный элемент будет добавлен как новый элемент, он не сохранит свое первоначальное положение до удаления console.log(mySet1); // Set(5) < 1, "текст", , , 5 >
Итерация по объекту Set
Итерация наборов проходит по элементам в порядке вставки.
for (const item of mySet1) console.log(item); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 for (const item of mySet1.keys()) console.log(item); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 for (const item of mySet1.values()) console.log(item); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 // ключ и значение здесь одинаковы for (const [key, value] of mySet1.entries()) console.log(key); > // 1, "текст", < "a": 1, "b": 2 >, < "a": 1, "b": 2 >, 5 // Преобразуем объект Set в объект Array с помощью Array.from const myArr = Array.from(mySet1); // [1, "текст", , , 5] // следующее также будет работать, если запустить его в HTML-документе mySet1.add(document.body); mySet1.has(document.querySelector("body")); // true // преобразование между Set и Array const mySet2 = new Set([1, 2, 3, 4]); console.log(mySet2.size); // 4 console.log([. mySet2]); // [1, 2, 3, 4] // пересечение можно представить следующим образом const intersection = new Set([. mySet1].filter((x) => mySet2.has(x))); // разность можно представить следующим образом const difference = new Set([. mySet1].filter((x) => !mySet2.has(x))); // итерироваться можно с помощью forEach() mySet2.forEach((value) => console.log(value); >); // 1 // 2 // 3 // 4
Реализация базовых операций Set
function isSuperset(set, subset) for (const elem of subset) if (!set.has(elem)) return false; > > return true; > function union(setA, setB) const _union = new Set(setA); for (const elem of setB) _union.add(elem); > return _union; > function intersection(setA, setB) const _intersection = new Set(); for (const elem of setB) if (setA.has(elem)) _intersection.add(elem); > > return _intersection; > function symmetricDifference(setA, setB) const _difference = new Set(setA); for (const elem of setB) if (_difference.has(elem)) _difference.delete(elem); > else _difference.add(elem); > > return _difference; > function difference(setA, setB) const _difference = new Set(setA); for (const elem of setB) _difference.delete(elem); > return _difference; > // Примеры const setA = new Set([1, 2, 3, 4]); const setB = new Set([2, 3]); const setC = new Set([3, 4, 5, 6]); isSuperset(setA, setB); // true union(setA, setC); // Set intersection(setA, setC); // Set symmetricDifference(setA, setC); // Set difference(setA, setC); // Set
Связь с объектами массива
const myArray = ["value1", "value2", "value3"]; // Используйте обычный конструктор Set для преобразования массива в набор const mySet = new Set(myArray); mySet.has("value1"); // true // Используйте синтаксис spread для преобразования набора в массив. console.log([. mySet]); // Покажет вам точно такой же массив, как и myArray
Удаление повторяющиеся элементов из массива
const numbers = [2, 3, 4, 4, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 5, 32, 3, 4, 5]; console.log([. new Set(numbers)]); // [2, 3, 4, 5, 6, 7, 32]
Связь со строками
const text = "Индия"; const mySet = new Set(text); // Set(5) mySet.size; // 5 // чувствительный к регистру и пропускает дубликаты new Set("Слово"); // Set(5) new Set("Слово"); // Set(4) < "С", "л", "о", "в">// "о" встречается дважды в слове, но в объекте будет только одна
Используйте Set для обеспечения уникальности списка значений
const array = Array.from(document.querySelectorAll("[id]")).map((e) => e.id); const set = new Set(array); console.assert(set.size === array.length);
Спецификации
Specification ECMAScript Language Specification
# sec-set-objectsБраузерная поддержка
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 8 окт. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.Сет — что это такое? Определение, значение, перевод
Сет (Set) это английское слово, в широком смысле означающее «набор» или «серию». В русском языке слово «сет» употребляется в нескольких главных контекстах:
В теннисе, волейболе, бадминтоне и некоторых других видах спорта «сетом» называется партия, которая в большом теннисе состоит из геймов, а в волейболе из розыгрышей мяча. Матч в этих видах спорта, как правило, ведётся до трёх сетов, выигранных одной из сторон.
В музыкальном сленге слово «сет» означает подборку песен или композиций, исполняемых на концерте. В этом контексте часто можно услышать фразу DJ-сет, то есть подборку композиций, которую играет DJ во время вечеринки.
У фотографов «сетом» называется подборка фотографий, сделанных за определённую фотосессию.
А ещё Сет — имя древнего египетского бога ярости и песчаных бурь, который и слыхом не слыхал про теннис и диджеев.
Метки / Сленг / Спорт / МузыкаПонравилась страница?
Пожалуйста, поделитесь ссылкой с друзьями: