НМЦ

Програмування мовою Python: основи та практика

Електронний посібник

 

ВФПО

ТЕМА 7.5. МНОЖИНИ

 

 

 

 

Уроки Python з нуля / #11 – Множини (set и frozenset)

 

Презентація. Множини в PYTHON №7.5

 

 

Множини у мові Python подібні до їх математичних аналогів та являють собою структуру даних, що містить унікальні та невпорядковані елементи. Вони використовуються тоді, коли важлива саме наявність елементу, а не його порядок чи частота, з якою він трапляється.

 

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

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

 

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

Множини записують як перелік елементів, розділених комами та взяті у фігурні дужки. {1, 2, 3, ‘Hello’}.

 

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

 

 

Задання порожньої множини виконується з використанням функції set():

>>> a = set()

Використання «{}» призведе до створення порожнього словника:

>>> s={}

>>> type(s)

<class ‘dict’>

Проте можна задати множину, перерахувавши її елементи, взяті в фігурні дужки «{}»:

>>> s1 = {1, 2, 3}

>>> s2 = {‘a’, ‘b’, ‘c’, 5}

 

Для створення множин можна використовувати генератори множин. Принцип той самий, що й у генераторах списків, тільки для множин генератор беруть не в прямокутні, а у фігурні дужки.

 

Створення множини з інших структур даних

 

Множину можна створити з елементів об’єкта, який можна пройти по елементах (як-от діапазон, список, рядок, словник, кортеж, файл тощо), використовуючи функцію set([ітерований об’єкт]). Проте важливо зазначити, що в множину увійдуть лише унікальні елементи.>>> a = set(‘hello’)

>>> a

{‘e’, ‘o’, ‘l’, ‘h’}

>>> set(range(5)

{0, 1, 2, 3, 4}

 

Множина може містити тільки елементи незмінних типів. Тому, наприклад, список елементом множини бути не може. Не може бути елементом множини інша множина. Як наслідок, проблема створення поверхневих або повних копій, із якою ми зустрілися під час обговорення списків, для множин є неактуальною. Водночас, якщо спробувати створити копію множини за допомогою оператора присвоювання, тобто, просто присвоївши одній змінній значення іншої змінної (яка посилається на множину), то отримаємо дві змінні, які посилаються на одну й ту саму множину.

Перевірити, чи посилаються змінні на один і той самий об’єкт (зокрема, таким об’єктом може бути множина) можна за допомогою оператора is.

 

 

Як зазначалося раніше, можна перевірити приналежність деякого елементу до множини, використовуючи оператор in (значення in ім’я_множини).

>>> a = {1, 2, 3}

>>> 2 in a

True

>>> 2 not in a

False

Відповідно для перебору всіх елементів множини (в невизначеному порядку) необхідно скористатися циклом for:

s = {2, 5, 7, 11, 4}

for num in s:

    print(num)

 

7.5.3. Порівняння множин

 

Множини можна порівнювати між собою. Порівняння множин зводиться до перевірки, чи є множини рівними, або чи є певна множина підмножиною іншої.

>>> a={1,2,3}

>>> b={1,2,3}

>>> d={1,2,3,4}

>>> c={4,5,6}

set == other. Перевірка, чи множини set та other рівні. Повертає True, якщо всі елементи множини set належать множині other, і всі елементи множини other належать множині set, інакшеFalse.

>>> a == b

True

>>> a == d

False

set != other. Перевірка, чи є множини set та other не рівними. Повертає True, якщо принаймні один елемент множини set не належить множині other, або принаймні один елемент множини other не належить множині set, інакшеFalse.

>>> a != b

False

>>> a != d

True

set <= other. Перевірка, чи є множина set підмножиною множини other. Повертає True, якщо всі елементи множини set належать множині other, інакшеFalse.

>>> a<=d

True

>>> a<=b

True

set < other. Повертає True, якщо всі елементи множини set належать множині other, але не всі елементи множини other належать множині set, інакшеFalse.

>>> a<d

True

>>> a<b

False

set.isdisjoint(other). Повертає True, якщо множини set і other не мають спільних елементів, інакшеFalse.

>>> a.isdisjoint(c)

True

>>> c.isdisjoint(d)

False

set.issubset(other). Перевірка, чи є множина set підмножиною множини other. Аналогічно до set <= other.

set.issuperset(other). Перевірка чи є множина other підмножиною множини set. Аналогічно до set >= other.

 

 

set.add(x). Додає елемент x до множини set.

>>> s = {1, 2, 3}

>>> s.add(4)

>>> print(s)

{1, 2, 3, 4}

set.remove(x). Вилучає елемент x із множини set. Якщо такого елементу в множині немає, то виникає виняток KeyError.

set.discard(x). Вилучає елемент x із множини set. Якщо такого елементу в множині немає, то нічого не відбувається.

set.pop(). Вилучає «перший» елемент з множини set та повертає його значення як результат виконання функції.

 

Оскільки множина ‒ це невпорядкований набір, то не можна чітко передбачити, який з елементів буде взятий як перший.

 

Якщо множина порожня, то виникає виняток KeyError.

set.clear(). Очищує множину set (вилучає всі елементи з множини).

 

Операції з множинами

 

>>> d={1,2,3,4}

>>> c={4,5,6}

set.union(*other)  або set        |....... other |  Повертає об’єднання множин set і other. Множина-результат міститиме як елементи множини set, так і елементи множини other.

>>> d | c

{1, 2, 3, 4, 5, 6}

set.intersection(*other) або set & other & .... Повертає перетин множин set і other. Множина-результат міститиме елементи, які належать як множині set, так і множині other.

>>> d & c

{4}

set.difference(*other) або set other Повертає різницю множин set і other. Множина-результат міститиме елементи множини set, які не належать множині other.

>>> d - c

{1, 2, 3}

>>> c - d

{5, 6}

set.symmetric_difference(*other) або set ^ other. Повертає симетричну різницю множин set і other. Множина-результат міститиме елементи, які належать множинам set та other, але не належать обом множинам. Аналогічно до (set | other)–(set & other).

>>> d^c

{1, 2, 3, 5, 6}

Як можна бачити, вказані методи не призводять до зміни множини, а за ними відбувається формування нової множини. Проте для множин передбачені методи, шо призводитимуть до зміни початкової множини.

set.update(*other) або set |= other. Додає до множини set всі елементи множини other. Множина set міститиме об’єднання множин set і other.

set.intersection_update(*other) або set &= other. Вилучає з множини set всі елементи, які не входять до множини other. Множина set міститиме перетин множин set і other.

set.difference_update(*other) або set -= other. Вилучає з множини set всі елементи, які входять до множини other. Множина set міститиме різницю множин set і other.

set.symmetric_difference_update(other) або set ^= other. Множина set міститиме симетричну різницю множин set і other.

 

 

Приклад. Дано два рядки. Написати програму, за якою буде створено дві множини (перша ‒ із символів першого рядка, друга ‒ із символів другого рядка) та виведено перетин, об’єднання, різницю цих множин.

st1=input(‘Введіть 1-й рядок’)

st2=input(‘Введіть 2-й рядок’)

s1=set(st1)

s2=set(st2)

o=s1|s2

p=s1&s2

r1=s1-s2

r2=s2-s1

print(Множина 1:’,s1)

print(Множина 2:’,s2)

print(«Обєднання 1:»,o)

print(Перетин 1:’,p)

print(Різниця між 1-ю і 2-ю множинами:’,r1)

print(Різниця між 2-ю і 1-ю множинами:’,r2)

 

Приклад. Приклад. Об’єднання множин

# Перша множина (множина A)

A={1,2,3,4}

# Відображаємо вміст множини

print(ʺМножина A:ʺ,A)

# Друга множина (множина B)

B={3,4,5,6}

# Відображаємо вміст множини

print(ʺМножина B:ʺ,B)

# Об’єднання множин (множина C)

C=A|B

# Відображаємо результат

print(ʺМножина C=A|B:ʺ,C)

# Об’єднання множин

print(ʺМножина A.union(B):ʺ,A.union(B))

print(ʺМножина B.union(A):ʺ,B.union(A))

# Змінюємо множину A

A.update(B)

# Перевіряємо результат

print(ʺМножина A:ʺ,A)

# Змінюємо множину B

B=B|{-1,-2,-3}

# Перевіряємо результат

print(ʺМножина B:ʺ,B)

# Змінюємо множину C

C|={7,8,9}

# Перевіряємо результат

print(ʺМножина C:ʺ,C)

Результат виконання цього програмного коду такий:

Множина A: {1, 2, 3, 4}

Множина B: {3, 4, 5, 6}

Множина C=A|B: {1, 2, 3, 4, 5, 6}

Множина A.union(B): {1, 2, 3, 4, 5, 6}

Множина B.union(A): {1, 2, 3, 4, 5, 6}

Множина A: {1, 2, 3, 4, 5, 6}

Множина B: {3, 4, 5, 6, -2, -3, -1}

Множина C: {1, 2, 3, 4, 5, 6, 7, 8, 9}

 

Приклад. Перетин множин

# Перша множина (множина A)

A={1,2,3,4}

# Відображаємо вміст множини

print(ʺМножина A:ʺ,A)

# Друга множина (множина B)

B={3,4,5,6}

 # Відображаємо вміст множини

print(ʺМножина B:ʺ,B)

# Перетин множин (множина C)

C=A&B

# Відображаємо результат

print(ʺМножина C=A&B:ʺ,C)

# Перетин множин

print(ʺМножина A.intersection(B):ʺ,A.intersection(B))

print(ʺМножина B.intersection(A):ʺ,B.intersection(A))

# Змінюємо множину A

A.intersection_update(B)

# Перевіряємо результат

print(ʺМножина A:ʺ,A)

# Змінюємо множину B

B=B&{4,6,8,10}

# Перевіряємо результат

print(ʺМножина B:ʺ,B)

# Змінюємо множину C

C&={1,2,3}

# Перевіряємо результат

print(ʺМножина C:ʺ,C)

Як результат виконання наведеного програмного коду отримуємо:

Множина A: {1, 2, 3, 4}

Множина B: {3, 4, 5, 6}

Множина C=A&B: {3, 4}

Множина A.intersection(B): {3, 4}

Множина B.intersection(A): {3, 4}

Множина A: {3, 4}

Множина B: {4, 6}

 

Приклад. Різниця множин

# Перша множина (множина A)

A={1,2,3,4}

# Відображаємо вміст множини

print(ʺМножина A:ʺ,A)

# Друга множина (множина B)

B={3,4,5,6}

# Відображаємо вміст множини

print(ʺМножина B:ʺ,B)

# Різниця множин (множина C)

C=A-B

# Відображаємо результат

print(ʺМножина C=A-B:ʺ,C)

# Різниця множин

print(ʺМножина A.difference(B):ʺ,A.difference(B))

print(ʺМножина B.difference(A):ʺ,B.difference(A))

# Змінюємо множину A

A.difference_update(B)

# Перевіряємо результат

print(ʺМножина A:ʺ,A)

# Змінюємо множину B

B=B-{4,6,8,10}

# Перевіряємо результат

print(ʺМножина B:ʺ,B)

# Змінюємо множину C

C-={1,3,5}

# Перевіряємо результат

print(ʺМножина C:ʺ,C)

 Результат виконання програми

Множина A: {1, 2, 3, 4}

Множина B: {3, 4, 5, 6}

Множина C=A-B: {1, 2}

Множина A.difference(B): {1, 2}

Множина B.difference(A): {5, 6}

Множина A: {1, 2}

Множина B: {3, 5}

Множина C: {2}

 

Приклад. Дано рядок, який складається із слів, розділених пропусками та розділовими знаками (,.!?). Написати програму, за якою буде виведено всі слова, що не містять повторюваних символів.

s=input(Введіть рядок:‘)

a=list(s.split(‘ ‘))

a=[i.strip(‘,.!?’) for i in a if i!=‘‘]

for i in a:

    if len(i)==len(set(i)):

       print(i)

Останній цикл можна переписати у формі генератора списку:

[print(i) for i in a if len(i)==len(set(i))]

 

Приклад. Використання множин

# Верхня межа

n=100

# Множина натуральних чисел

E={s for s in range(1,n+1)}

# Множина чисел, які у разі ділення

# на 5 дають в остачі 2

A1={s for s in E if s%5==2}

# Множина чисел, які у разі ділення

# на 5 дають в остачі 4

A2={s for s in E if s%5==4}

# Множина чисел, які у разі ділення

# на 5 дають в остачі 2 або 4

A=A1|A2

# Множина чисел, які у разі ділення

# на 7 дають в остачі 3

B={s for s in E if s%7==3}

# Множина чисел, які у разі ділення

# на 3 дають в остачі 1

C={s for s in E if s%3==1}

# Множина чисел, які у разі ділення на 5 дають в остачі 2

# або 4, у разі ділення на 7 дають в остачі 3, а у разі ділення

# на 3 не дають в остачі 1

D=(A&B)-C

# Відображаємо результат

print(ʺНаведені нижче числа від 1 доʺ,n)

print(ʺ1) у разі ділення на 5 дають в остачі 2 або 4;ʺ)

print(ʺ2) у разі ділення на 7 дають в остачі 3;ʺ)

print(ʺ3) у разі ділення на 3 не дають в остачі 1:ʺ)

print(D)

Результат виконання програми

Наведені нижче числа від 1 до 100

1) у разі ділення на 5 дають в остачі 2 або 4;

2) у разі ділення на 7 дають в остачі 3;

3) у разі ділення на 3 не дають в остачі 1:

{24, 17, 59, 87}

 

Приклад. Створення множини через цикл

# Верхня межа

n=100

# Порожня множина

D=set()

# Формується множина чисел, які у разі ділення

# на 5 дають в остачі 2 або 4, у разі ділення на 7

# дають в остачі 3, а у разі ділення на 3 не дають

# в остачі 1

for s in range(1,n+1):

if s%5==2 or s%5==4:

if s%7==3:

if s%3!=1:

D.add(s)

# Відображаємо результат

print(ʺНаведені нижче числа від 1 доʺ,n)

print(ʺ1) у разі ділення на 5 дають в остачі 2 або 4;ʺ)

print(ʺ2) у разі ділення на 7 дають в остачі 3;ʺ)

print(ʺ3) у разі ділення на 3 не дають в остачі 1:ʺ)

print(D)

Результат виконання програми

Наведені нижче числа від 1 до 100

1) у разі ділення на 5 дають в остачі 2 або 4;

2) у разі ділення на 7 дають в остачі 3;

3) у разі ділення на 3 не дають в остачі 1:

{24, 17, 59, 87}

 

Завдання для самоперевірки

 

Завдання 1.

1. Задано множину цілих чисел від «1» до «50». Скласти програму, яка визначає, скільки з них є числами Фібоначчі і скільки чисел, в запису яких перша значуща цифра дорівнює «1» або «2».

2. Задано множину символів від ‘a’ до ‘z’: Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz Скласти програму, яка визначає і виводить на екран елементи цієї множини в алфавітному порядку.

3. Задано текст з цифр і літер латинського алфавіту. Скласти програму, яка визначає, яких літер – голосних {a, e, i, o, u, y} або приголосних більше в цьому тексті.

4. Задано множини символів А i символ «х». Скласти програму, яка формує множину В з множини А за таким правилом: а) додавання елементу х, якщо його немає в А; б) видалення елементу х, якщо він є в А.

5. Задано речення українською мовою з малих літер. Скласти програму, яка визначає і робить великими (заголовними) всі літери в тих словах, в яких приголосних менше голосних.

6. Задано речення українською мовою з великих літер. Скласти програму, яка визначає і робить маленькими всі літери в тих словах, в яких приголосних літер більше голосних.

7. Задано речення українською мовою з малих літер. Скласти програму, яка визначає і видаляє з нього три слова, що містять найбільшу кількість різних приголосних літер.

8. Задано речення. Скласти програму, яка визначає і видаляє з нього два слова, які містять найбільшу кількість різних голосних латинського алфавіту (множина {a, e, i, o, u, y}).

 

 

Множина ‒ це невпорядкований набір унікальних елементів.

 

Ø Створюють множину за допомогою функції set() (як аргумент передається список із елементами множини) або через перерахування елементів у фігурних дужках.

Ø Для перевірки того, чи входить елемент у множину, використовують оператор in.

Ø Кількість елементів у множині визначають за допомогою функції len().

Ø Для створення копії множини використовують метод copy().

Ø Для додавання елементу в множину використовують метод add(), для видалення метод remove(). Для додавання в множину елементів іншої множини використовують метод update().

Ø Об’єднання множин множина, елементи якої складаються з елементів об’єднуваних множин. Для об’єднання множин використовують метод union() або оператор |.

Ø Перетин множин множина, елементи якої складаються з елементів, спільних для обох множин. Для обчислення перетину множин використовують метод intersection() або оператор &.

Ø Різниця множин множина, елементи якої складаються з елементів першої множини за винятком тих елементів, які входять у другу множину. Для обчислення різниці множин використовують метод difference() або оператор ^

Ø Симетрична різниця множин множина, елементи якої складаються з елементів першої і другої множин за винятком тих елементів, які входять в обидві множини водночас. Для обчислення симетричної різниці множин використовують метод symmetric_difference() або оператор ^.

Ø Для порівняння множин використовують оператори == (рівність множин), < (перша множина є підмножиною другої множини), <= (перша множина є підмножиною другої множини або множини рівні), > (друга множина є підмножиною першої множини), >= (друга множина є підмножиною першої множини або множини рівні).

Ø Генератор множини подібний до генератора списку, але вся конструкція береться у фігурні дужки.

Ø Кількість літер у текстовому рядку можна визначити за допомогою функції len().

Ø Є значна кількість методів, які дають змогу виконувати найрізноманітніші операції з текстовими значеннями, як-от: перетворення реєстру символів, пошук символів і підрядків, заміна текстових фрагментів, розбивка рядків на підрядки, перевірка вмісту текстового рядка, форматування текстового рядка для виведення в консоль і багато іншого.

 

Питання для перевірки засвоєних знань

1. Що таке множина в Python?

2. Як створити порожню множину у Python?

3. Які основні властивості множин в Python?

4. Чи можна в множині мати дубльовані значення?

5. Які методи є у множин у Python?

6. Як додати елемент до множини?

7. Як видалити елемент з множини?

8. Як перевірити належність елементу до множини?

9. Чи можна додати список до множини без ітерації?

10. Як об’єднати дві множини?

11. Як ви виконуєте пошук спільних елементів між двома множинами?

12. Як ви визначаєте, чи є одна множина підмножиною іншої?

13. Які методи використовують для об’єднання множин?

14. Як ви виконуєте перетин двох множин?

15. Як ви видаляєте спільні елементи з однієї множини до іншої?

16. Як ви визначаєте різницю між двома множинами?

17. Як ви знаходите елементи, які є лише в одній з двох множин?

18. Чому методи для виконання дій над множинами не мають вибудованих операторів?

19. Як ви перевіряєте, чи є дві множини рівними?

20. Як ви виконуєте об’єднання без зміни початкових множин?

Попередня тема

На початок

Наступна тема