Повний посібник із прикладами коду

У цьому підручнику ви дізнаєтеся про основи наборів Python і різні методи наборів, які можна використовувати для зміни наборів Python.

Набори є однією з вбудованих структур даних у Python. Коли вам потрібно працювати з неповторюваною колекцією елементів, ви будете використовувати набір як структуру даних переходу.

У наступних кількох розділах ми розглянемо основи наборів Python і методи наборів, які можна використовувати для роботи з ними. Потім ми навчимося виконувати загальні операції з наборами в Python.

Давайте почнемо!

Основи наборів Python

У Python набір — це невпорядкована сукупність елементів, що не повторюються. Це означає, що всі елементи в наборі мають бути різними.

Ви можете додавати та видаляти елементи з набору; отже, набір є змінною колекцією. Він може містити елементи різних типів даних. Однак окремі елементи в комплекті повинні бути хешований.

У Python об’єкт вважається хешованим, якщо його хеш-значення ніколи не змінюється. Більшість незмінних об’єктів, таких як рядки Python, кортежі та словники, можна хешувати.

Дізнаємося про створення наборів докладніше. Наразі розглянемо наступні два набори:

py_set = {0,1,2,(2,3,4),'Cool!'}
py_set = {0,1,2,[2,3,4],'Oops!'}

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-40-2d3716c7fe01> in <module>()
----> 1 py_set = {0,1,2,[2,3,4],'Oops!'}

TypeError: unhashable type: 'list'

Перший набір містить три числа, кортеж і рядок. Ініціалізація набору виконується без помилок. Тоді як другий набір містить список замість кортежу. Список є змінною колекцією, її не можна хешувати, а ініціалізація видає TypeError.

📑 Зібравши все разом, ми можемо визначити набір Python як змінну колекцію окремих елементів, які можна хешувати.

Як створити набір Python

Ми почнемо з вивчення того, як створити набір у Python.

#1. Використання явної ініціалізації

Ви можете створити набір у Python, вказавши елементи набору, розділивши їх комами (,) і взявши їх у пару фігурних дужок {}.

py_set1 = {'Python','C','C++','JavaScript'}
type(py_set1)

# Output
set

Якщо ви раніше працювали зі списками Python, ви це знаєте [] ініціалізує порожній список. Незважаючи на те, що набір Python укладено в пару фігурних дужок {}, ви не можете використовувати пару {} для ініціалізації набору. Це тому, що {} ініціалізує словник Python, а не набір Python.

py_set2 = {}
type(py_set2)

# Output
dict

Ви можете знову викликати функцію type(), щоб переконатися, що py_set це словник (dict).

#2. Використання функції set().

Якщо ви хочете ініціалізувати порожній набір, а потім додати до нього елементи, це можна зробити за допомогою функції set().

py_set3 = set()
type(py_set3)

# Output
set

#3. Приведення інших ітерованих елементів до набору

Інший спосіб створення наборів – це приведення інших ітерованих елементів, таких як списки та кортежі, до наборів за допомогою set(iterable).

py_list = ['Python','C','C++','JavaScript','C']
py_set4 = set(py_list)
print(py_set4)
# {'C++', 'C', 'JavaScript', 'Python'} # repeating element 'C' removed
type(py_set4)
# set

У наведеному вище прикладі py_list двічі містить «C». Але в py_set4 «C» з’являється лише один раз, оскільки набір є набором різних елементів. Ця техніка приведення до набору часто використовується для видалення дублікатів зі списків Python.

  Як конвертувати WAV в MP3

Як додати елементи до набору Python

Давайте почнемо зі створення порожнього набору py_set і роботи з ним до кінця цього уроку.

py_set = set()
len(py_set) # returns the length of a set
# Output
0

#1. Використання методу .add().

Щоб додати елементи до набору, ви можете використовувати метод .add(). set.add(element) додає елемент до набору.

Для ясності ми додамо елементи до набору Python і роздрукуємо набір на кожному кроці.

▶️ Давайте додамо рядок “Python” як елемент до py_set.

py_set.add('Python')
print(py_set)

# Output
{'Python'}

Далі ми додамо ще один елемент.

py_set.add('C++')
print(py_set)

# Output
{'Python', 'C++'}

Важливо розуміти, що метод .add() лише додає елемент до набору, якщо він ще не присутній. Якщо набір уже містить елемент, який ви бажаєте додати, операція додавання не матиме ефекту.

Щоб перевірити це, давайте спробуємо додати «C++» до py_set.

py_set.add('C++')
print(py_set)

# Output
{'Python', 'C++'}

Набір містить «C++», тому операція додавання не має ефекту.

▶️ Давайте додамо ще кілька елементів до набору.

py_set.add('C')
print(py_set)
py_set.add('JavaScript')
print(py_set)
py_set.add('Rust')
print(py_set)

# Output
{'Python', 'C++', 'C'}
{'JavaScript', 'Python', 'C++', 'C'}
{'Rust', 'JavaScript', 'Python', 'C++', 'C'}

#2. Використання методу .update().

Поки що ми бачили, як додавати елементи до існуючого набору – по одному елементу за раз.

Що робити, якщо ви хочете додати більше одного елемента до послідовності елементів?

Ви можете зробити це за допомогою методу .update() із синтаксисом: set.update(collection), щоб додати елементи колекції до набору. Колекція може бути списком, кортежем, словником тощо.

py_set.update(['Julia','Ruby','Scala','Java'])
print(py_set)

# Output
{'C', 'C++', 'Java', 'JavaScript', 'Julia', 'Python', 'Ruby', 'Rust', 'Scala'}

Цей метод корисний, коли ви хочете додати колекцію елементів до набору без створення іншого об’єкта в пам’яті.

У наступному розділі давайте дізнаємося, як видалити елементи з набору.

Як видалити елементи з набору Python

Розглянемо наступний набір (py_set до операції оновлення).

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}

#1. Використання методу .pop().

set.pop() випадковим чином видаляє елемент із набору та повертає його. Давайте викличемо метод pop на py_set і подивимося, що він повертає.

py_set.pop()

# Output
'Rust'

Цього разу виклик методу .pop() повернув рядок «Rust».

Примітка. Оскільки метод .pop() повертає елемент у випадковому порядку, коли ви виконуєте код у своєму кінці, ви також можете отримати інший елемент.

Коли ми перевіряємо набір, «Іржа» більше не присутня в наборі.

print(py_set)

# Output
{'JavaScript', 'Python', 'C++', 'C'}

#2. Використання методів .remove() і discard().

На практиці ви можете видалити певні елементи з набору. Для цього можна використовувати методи .remove() і .discard().

set.remove(element) видаляє елементи з набору.

py_set.remove('C')
print(py_set)

# Output
{'JavaScript', 'Python', 'C++'}

Якщо ми спробуємо видалити елемент, якого немає в наборі, ми зіткнемося з KeyError.

py_set.remove('Scala')

# Output
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-58-a1abab3a8892> in <module>()
----> 1 py_set.remove('Scala')

KeyError: 'Scala'

Давайте знову подивимося на py_set it. Тепер у нас є три елементи.

print(py_set)

# Output
{'JavaScript', 'Python', 'C++'}

Із синтаксисом set.discard(element) метод .discard() також видаляє елементи з набору.

py_set.discard('C++')
print(py_set)

# Output
{'JavaScript', 'Python'}

Однак він відрізняється від методу .remove() тим, що він не викликає KeyError, коли ми намагаємося видалити елемент, якого немає.

Якщо ми спробуємо видалити «Scala» (якої не існує) зі списку за допомогою методу .discard(), помилки не буде.

py_set.discard('Scala') #no error!
print(py_set)

# Output
{'JavaScript', 'Python'}

Як отримати доступ до елементів набору Python

Поки що ми навчилися додавати та видаляти елементи з наборів Python. Однак ми ще не бачили, як отримати доступ до окремих елементів у наборі.

  Як виправити Adobe Photoshop CC, якщо він виходить з ладу або повільно

Оскільки набір є невпорядкованою колекцією, його не можна індексувати. Тому, якщо ви спробуєте отримати доступ до елементів набору за допомогою індексу, ви зіткнетеся з помилкою, як показано.

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}

print(py_set[0])

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-0329274f4580> in <module>()
----> 1 print(py_set[0])

TypeError: 'set' object is not subscriptable

Отже, як отримати доступ до елементів у наборі?

Є два поширені способи зробити це:

  • Перегляньте набір і отримайте доступ до кожного елемента
  • Перевірте, чи певний елемент є членом набору

▶️ Перебирайте елементи набору та доступу за допомогою циклу for.

for elt in py_set:
  print(elt)

# Output
C++
JavaScript
Python
Rust
C

На практиці ви можете перевірити, чи присутній певний елемент у наборі за допомогою оператора in.

Примітка: element in set повертає True, якщо елемент присутній у наборі; інакше він повертає False.

У цьому прикладі py_set містить «C++» і не містить «Julia», а оператор in повертає True і False відповідно.

'C++' in py_set
# True
'Julia' in py_set
# False

Як знайти довжину набору Python

Як було показано раніше, ви можете використовувати функцію len(), щоб отримати кількість елементів, присутніх у наборі.

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}
len(py_set)

# Output: 5

Як очистити набір Python

Щоб очистити набір, видаливши всі елементи, ви можете використати метод .clear().

Давайте викличемо метод .clear() на py_set.

py_set.clear()

Якщо ви спробуєте його роздрукувати, ви отримаєте set() – вказуючи, що набір порожній. Ви також можете викликати функцію len(), щоб переконатися, що довжина набору дорівнює нулю.

print(py_set)
# set()
print(len(py_set))
# 0

Наразі ми навчилися виконувати основні операції CRUD над наборами Python:

  • Створення: використання функції set(), приведення типів та ініціалізація
  • Читати: отримати доступ до елементів набору за допомогою циклів і оператора in для перевірки членства
  • Оновлення: додавання, видалення елементів із наборів і оновлення наборів
  • Видалити: очистити набір, видаливши з нього всі елементи

Загальні операції з набором, пояснені за допомогою коду Python

Набори Python також дозволяють нам виконувати основні операції з наборами. Про них ми дізнаємося в цьому розділі.

#1. Об’єднання множин у Python

У теорії множин об’єднання двох множин — це сукупність усіх елементів принаймні однієї з двох множин. Якщо є дві множини, A і B, тоді об’єднання містить елементи, які присутні лише в A, лише в B, а також елементи, присутні в A і B.

Щоб знайти об’єднання множин, ви можете використовувати | оператор або .union() метод із синтаксисом: setA.union(setB).

setA = {1,3,5,7,9}
setB = {2,4,6,8,9}

print(setA | setB)
# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

setA.union(setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

Об’єднання множин є комутативною операцією; тому AUB — це те саме, що BU A. Давайте перевіримо це, помінявши місцями setA та setB у виклику методу .union().

setB.union(setA)

# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

#2. Перетин множин у Python

Ще одна спільна операція множини — це перетин двох множин, A і B. Операція перетину множини повертає множину, яка містить усі елементи, наявні в A і B.

Щоб обчислити перетин, ви можете використовувати оператор & або метод .intersection(), як пояснюється у фрагменті коду нижче.

print(setA & setB)

# Output
{9}

setA.intersection(setB)

# Output
{9}

У цьому прикладі елемент 9 присутній як у наборі A, так і в наборі B; тому множина перетину містить лише цей елемент.

  5 наборів даних, які стартапи можуть використовувати для кращих результатів

Як і об’єднання множин, перетин множин також є комутативною операцією.

setB.intersection(setA)

# Output
{9}

#3. Встановити різницю в Python

Дано будь-які дві множини, об’єднання та перетин допомагають нам знайти елементи, присутні в обох і принаймні в одній із множин відповідно. З іншого боку, різниця множин допомагає нам знайти елементи, присутні в одній множині, але відсутні в іншій.

– setA.difference(setB) дає набір елементів, які присутні лише в setA, але не в setB.

– setB.difference(setA) дає набір елементів, які присутні лише в setB, а не в setA.

print(setA - setB)

print(setB - setA)

# Output
{1, 3, 5, 7}
{8, 2, 4, 6}

Зрозуміло, що AB не те саме, що BA, тому різниця множин не є комутативною операцією.

setA.difference(setB)
# {1, 3, 5, 7}

setB.difference(setA)
# {2, 4, 6, 8}

#4. Різниця симетричного набору в Python

Тоді як перетин множин дає нам елементи, присутні в обох множинах, симетрична різниця множин повертає набір елементів, присутніх точно в одній із множин.

Розглянемо наступний приклад.

setA = {1,3,5,7,10,12}
setB = {2,4,6,8,10,12}

Щоб обчислити набір симетричних різниць, ви можете використовувати оператор ^ або метод .symmetric_difference().

print(setA ^ setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

Елементи 10 і 12 присутні як в наборі A, так і в наборі B. Отже, вони відсутні в симетричному різницевому наборі.

setA.symmetric_difference(setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

Оскільки операція різниці симетричних множин збирає всі елементи, які з’являються точно в одному з двох наборів, результуюча множина є однаковою незалежно від порядку, у якому збираються елементи. Отже, симетрична різниця множин є комутативною операцією.

setB.symmetric_difference(setA)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

#5. Підмножини та надмножини в Python

У теорії множин підмножини та надмножини допомагають зрозуміти зв’язок між двома множинами.

За наявності двох множин A і B множина B є підмножиною множини A, якщо всі елементи множини B також присутні в множині A. А множина A є надмножиною множини B.

Розглянемо приклад двох наборів: languages ​​і languages_extended.

languages = {'Python', 'JavaScript','C','C++'}
languages_extended = {'Python', 'JavaScript','C','C++','Rust','Go','Scala'}

У Python ви можете використовувати метод .issubset(), щоб перевірити, чи даний набір є підмножиною іншого набору.

setA.issubset(setB) повертає True, якщо setA є підмножиною setB; інакше повертає False.

У цьому прикладі мови є підмножиною languages_extended.

languages.issubset(languages_extended)
# Output
True

Так само ви можете використовувати метод .issuperset(), щоб перевірити, чи є даний набір надмножиною іншого набору.

setA.issuperset(setB) повертає True, якщо setA є надмножиною setB; інакше повертає False.

languages_extended.issuperset(languages)
# Output
True

Оскільки languages_extended є надмножиною мов, languages_extended.issuperset(languages) повертає True, як показано вище.

Висновок

Сподіваюся, цей підручник допоміг вам зрозуміти роботу наборів Python, методів наборів для операцій CRUD і загальних операцій із наборами. Як наступний крок ви можете спробувати використовувати їх у своїх проектах Python.

Ви можете переглянути інші докладні посібники з Python. Щасливого навчання!