Python надає вбудований тип даних set, який обробляє набори.
Набір типів являє собою набір неповторюваних елементів (елементів, які не мають однакового значення, унікальних елементів) і може виконувати операції з наборами, такі як набір об’єднань, набір продуктів і набір різниць.
У цьому розділі основні операції в операціях з наборами типу набору пояснюються зі зразком коду.
- Створення об’єктів набору:
{}
,set()
- встановити нотацію включення
- Кількість елементів у наборі:
len()
- Додавання елемента до набору:
add()
- Видалити елемент із набору:
discard()
,remove()
,pop()
,clear()
- Wasset (злиття, об’єднання):|оператор,
union()
- Набори продуктів (загальні частини, перехрестя, перехрестя):& оператор,
intersection()
- відносне доповнення:-оператор,
difference()
- набір різниць симетрії:^ оператор,
symmetric_difference()
- підмножина чи ні:<= оператор,
issubset()
- Верхній комплект чи ні:>= оператор,
issuperset()
- Визначення того, чи є вони взаємно простими чи ні:
isdisjoint()
Тип набору є змінюваним типом, який може додавати та видаляти елементи, а також є тип замороженого набору, який має ту ж операцію набору та інші методи, що й тип набору, але є незмінним (не може бути змінений шляхом додавання, видалення чи іншої зміни елементів ).
- Створення об’єкта набору::{},set()
- встановити нотацію включення
- Кількість елементів у наборі:len()
- Додавання елемента до набору:add()
- Видалити елемент із набору:discard(),remove(),pop(),clear()
- Wasset (злиття, об’єднання):|оператор,union()
- Набори продуктів (загальні частини, перехрестя, перехрестя):& оператор,intersection()
- відносне доповнення:-оператор,difference()
- набір різниць симетрії:^ оператор,symmetric_difference()
- підмножина чи ні:<= оператор,issubset()
- Верхній комплект чи ні:>= оператор,issuperset()
- Визначення того, чи є вони взаємно простими чи ні:isdisjoint()
Створення об’єкта набору::{},set()
Створено хвильовими дужками {}
Об’єкти набору типів можна створювати, укладаючи елементи в дужки {}.
Якщо є повторювані значення, вони ігноруються, а елементами залишаються лише унікальні значення.
s = {1, 2, 2, 3, 1, 4}
print(s)
print(type(s))
# {1, 2, 3, 4}
# <class 'set'>
В якості елементів можна використовувати різні типи. Однак оновлювані об’єкти, наприклад типи списків, не можуть бути зареєстровані. Кортежи дозволені.
Крім того, оскільки типи наборів не впорядковані, порядок їх створення не зберігається.
s = {1.23, 'abc', (0, 1, 2), 'abc'}
print(s)
# {(0, 1, 2), 1.23, 'abc'}
# s = {[0, 1, 2]}
# TypeError: unhashable type: 'list'
Різні типи, такі як int і float, вважаються повторюваними, якщо їх значення еквівалентні.
s = {100, 100.0}
print(s)
# {100}
Оскільки порожня дужка {} вважається типом словника, об’єкт типу порожнього набору (порожній набір) можна створити за допомогою конструктора, описаного далі.
s = {}
print(s)
print(type(s))
# {}
# <class 'dict'>
Створено конструктором set()
Об’єкти типу set можна також створювати за допомогою конструктора set().
Зазначення ітераційного об’єкта, такого як список або кортеж, як аргумент генерує об’єкт набору, елементи якого є лише унікальними значеннями, виключаючи повторювані елементи.
l = [1, 2, 2, 3, 1, 4]
print(l)
print(type(l))
# [1, 2, 2, 3, 1, 4]
# <class 'list'>
s_l = set(l)
print(s_l)
print(type(s_l))
# {1, 2, 3, 4}
# <class 'set'>
Незмінні типи frozenset створюються за допомогою конструктора frozenset().
fs_l = frozenset(l)
print(fs_l)
print(type(fs_l))
# frozenset({1, 2, 3, 4})
# <class 'frozenset'>
Якщо аргумент опущено, створюється порожній об’єкт типу множини (порожній набір).
s = set()
print(s)
print(type(s))
# set()
# <class 'set'>
Повторювані елементи можна видалити зі списку або кортежу за допомогою set(), але порядок вихідного списку не зберігається.
Щоб перетворити тип набору в список або кортеж, використовуйте list(),tuple().
l = [2, 2, 3, 1, 3, 4]
l_unique = list(set(l))
print(l_unique)
# [1, 2, 3, 4]
Інформацію про видалення повторюваних елементів зі збереженням порядку, вилучення лише повторюваних елементів та обробку повторюваних елементів у двовимірному масиві (списку списків) див. у наступній статті.
встановити нотацію включення
Окрім розуміння списку, існують і встановлені розуміння. Просто замініть квадратні дужки [] на дужки {} у списку.
s = {i**2 for i in range(5)}
print(s)
# {0, 1, 4, 9, 16}
Перегляньте наступну статтю для отримання додаткової інформації про нотації для розуміння списку.
- ПОВ’ЯЗАНІ:Як використовувати списки Python
Кількість елементів у наборі:len()
Кількість елементів у наборі можна отримати за допомогою вбудованої функції len().
s = {1, 2, 2, 3, 1, 4}
print(s)
print(len(s))
# {1, 2, 3, 4}
# 4
Якщо ви хочете підрахувати кількість елементів у кожному списку, який містить елементи з повторюваними значеннями тощо, перегляньте наступну статтю.
Додавання елемента до набору:add()
Щоб додати елемент до набору, скористайтеся методом add().
s = {0, 1, 2}
s.add(3)
print(s)
# {0, 1, 2, 3}
Видалити елемент із набору:discard(),remove(),pop(),clear()
Щоб видалити елемент із набору, використовуйте методи discard(), remove(), pop() та clear().
Метод discard() видаляє елемент, зазначений в аргументі. Якщо вказано значення, яке не існує в наборі, нічого не робиться.
s = {0, 1, 2}
s.discard(1)
print(s)
# {0, 2}
s = {0, 1, 2}
s.discard(10)
print(s)
# {0, 1, 2}
Метод remove() також видаляє елемент, зазначений в аргументі, але повертається помилка KeyError, якщо вказано значення, яке не існує в наборі.
s = {0, 1, 2}
s.remove(1)
print(s)
# {0, 2}
# s = {0, 1, 2}
# s.remove(10)
# KeyError: 10
Метод pop() видаляє елементи з набору та повертає їх значення. Неможливо вибрати, які значення видалити. Порожній набір призведе до помилки KeyError.
s = {2, 1, 0}
v = s.pop()
print(s)
print(v)
# {1, 2}
# 0
s = {2, 1, 0}
print(s.pop())
# 0
print(s.pop())
# 1
print(s.pop())
# 2
# print(s.pop())
# KeyError: 'pop from an empty set'
Метод clear() видаляє всі елементи і робить набір порожнім.
s = {0, 1, 2}
s.clear()
print(s)
# set()
Wasset (злиття, об’єднання):|оператор,union()
Набір об’єднань (злиття, об’єднання) можна отримати за допомогою | оператор або метод union().
s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}
s_union = s1 | s2
print(s_union)
# {0, 1, 2, 3}
s_union = s1.union(s2)
print(s_union)
# {0, 1, 2, 3}
Для методу можна вказати кілька аргументів. На додаток до типу набору, списки та кортежи, які можна перетворити на тип набору за допомогою set(), також можуть бути вказані як аргументи. Те ж саме стосується наступних операторів і методів.
s_union = s1.union(s2, s3)
print(s_union)
# {0, 1, 2, 3, 4}
s_union = s1.union(s2, [5, 6, 5, 7, 5])
print(s_union)
# {0, 1, 2, 3, 5, 6, 7}
Набори продуктів (загальні частини, перехрестя, перехрестя):& оператор,intersection()
Набір продуктів (загальна частина, перетин і перетин) можна отримати за допомогою & оператор або метод intersection().
s_intersection = s1 & s2
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2)
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2, s3)
print(s_intersection)
# {2}
відносне доповнення:-оператор,difference()
Набір різниць можна отримати за допомогою оператора – або методу different().
s_difference = s1 - s2
print(s_difference)
# {0}
s_difference = s1.difference(s2)
print(s_difference)
# {0}
s_difference = s1.difference(s2, s3)
print(s_difference)
# {0}
набір різниць симетрії:^ оператор,symmetric_difference()
Симетричний різницевий набір (набір елементів, що міститься лише в одному з двох) можна отримати за допомогою оператора ^ або symmetric_difference().
Еквівалент ексклюзивної диз’юнкції (XOR) в логічних операціях.
s_symmetric_difference = s1 ^ s2
print(s_symmetric_difference)
# {0, 3}
s_symmetric_difference = s1.symmetric_difference(s2)
print(s_symmetric_difference)
# {0, 3}
підмножина чи ні:<= оператор,issubset()
Щоб визначити, чи є набір підмножиною іншого набору, використовуйте оператор <= або метод issubset().
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s1 <= s2)
# True
print(s1.issubset(s2))
# True
І оператор <=, і метод issubset() повертають true для еквівалентних наборів.
Щоб визначити, чи це підмножина істинна, використовуйте оператор <=, який повертає false для еквівалентних наборів.
print(s1 <= s1)
# True
print(s1.issubset(s1))
# True
print(s1 < s1)
# False
Верхній комплект чи ні:>= оператор,issuperset()
Щоб визначити, чи є один набір надмножиною іншого, використовуйте оператор >= або issuperset().
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s2 >= s1)
# True
print(s2.issuperset(s1))
# True
І оператор >=, і метод issuperset() повертають true для еквівалентних наборів.
Щоб визначити, чи є це істинним надмножиною, використовуйте оператор >=, який повертає false для еквівалентних наборів.
print(s1 >= s1)
# True
print(s1.issuperset(s1))
# True
print(s1 > s1)
# False
Визначення того, чи є вони взаємно простими чи ні:isdisjoint()
Щоб визначити, чи є дві множини простими один до одного, скористайтеся методом isdisjoint().
s1 = {0, 1}
s2 = {1, 2}
s3 = {2, 3}
print(s1.isdisjoint(s2))
# False
print(s1.isdisjoint(s3))
# True