Python. Обмеження на застосування множин. Застосування класу frozenset. Генератори множин




Обмеження на застосування множин. Застосування класу frozenset. Генератори множин


Зміст


Пошук на інших ресурсах:

1. Обмеження на множини. Які типи заборонено включати в множини?

У множини заборонено включати об’єкти змінюваних (mutable) типів, а саме:

  • списки;
  • словники;
  • змінювані (mutable) множини, які були створені конструктором класу set або операцією присвоєння.

Якщо спробувати включити у множину змінюваний тип, то інтерпретатор видасть помилку

TypeError: unhashable type: 'set'

 

2. Які типи дозволено включати в множини?

У множини дозволено включати об’єкти так званих незмінюваних або “хешованих” (hashable) типів. Об’єкт вважається “хешованим”, якщо він має значення, яке ніколи не змінюється протягом життя цього об’єкту в програмі.

До хешованих типів, об’єкти яких можна включати у множини, відносяться:

  • числові типи (дійсні, цілі типи);
  • логічний тип;
  • рядковий тип;
  • кортеж;
  • незмінювана множина, яка була створена з допомогою конструктора класу frozenset.

 

3. Особливості використання класу frozenset для множин. Приклад

Клас frozenset призначений для створення незмінюваної (immutable) множини. Додати нові елементи до незмінюваної множини або якось її змінити неможна. Незмінювана множина може бути включена як елемент (складова) іншої множини.

Для незмінюваної множини не можна застосувати функції, які її змінюють:

  • update() – об’єднання поточної множини з іншими;
  • intersection_update() – перетин поточної множини з іншими;
  • difference_update() – різниця поточної множини з іншими;
  • symmetric_difference_update() – симетрична різниця поточної множини з іншою множиною;
  • add() – додавання елементу в поточну множину;
  • remove() – видалення елементу з поточної множини;
  • discard() – видалення елементу з поточної множини, якщо він є наявний в ній;
  • pop() – витягування елементу з поточної множини;
  • clear() – видалення усіх елементів з множини.

Більш детально про роботу цих функцій описується в темі:

Приклад.

# Множини
# Функція frozenset() - створення множини незмінного типу

x = frozenset([1, 2, 3, 4]) # x - незмінювана (immutable) множина
y = set([5,6,7]) # y - змінювана (mutable) множина
z = { 8, 9, x } # у множину z включена множина x, множина z - змінювана

print('x = ', x)
print('y = ', y)
print('z = ', z)

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

x =  frozenset({1, 2, 3, 4})
y =  {5, 6, 7}
z =  {8, 9, frozenset({1, 2, 3, 4})}


 

4. Генератори множин. Поняття. Загальна форма

Генератор множин – це спеціальна конструкція, яка призначена для створення множини з допомогою циклу for.

Загальна форма генератора множин

{ statement for item in [items]}

де

  • statement – вираз (формула), що формує елементи новоствореної множини на основі переліку items;
  • item – елемент множини, що використовується у виразі statement. Цей елемент приймає значення з набору елементів items;
  • items – множина елементів вихідної множини, які перераховані через кому. Множина елементів items є безпосередніми даними, які використовуються у виразі statement для формування нової множини.

 

5. Приклади генераторів множин

Приклад 1. З цілими числами.

# Генератор множин
# Сформувати множину з цілих чисел
y = { 3*x for x in set([1,2,3,4,5,6])} # y = {3, 6, 9, 12, 15, 18}
print('y = ', y)

z = { t*t for t in { 2, 4, 6, 8 }}
print('z = ', z)

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

y = {3, 6, 9, 12, 15, 18}
z = {64, 16, 4, 36}

Приклад 2. З дійсними числами.

# Генератор множин
# Сформувати множину з дійсних чисел
y = { x+0.5 for x in set([1.5, 2.5, 3.5, -8.0])} # y =   {-7.5, 2.0, 3.0, 4.0}
print('y = ', y)

z = { t + 2*t for t in { 0.5, 0.75, 1.2, -3.4 }}
print('z = ', z) # z = {3.5999999999999996, 1.5, 2.25, -10.2}

Результат роботи програми

y = {-7.5, 2.0, 3.0, 4.0}
z = {3.5999999999999996, 1.5, 2.25, -10.2}

Приклад 3. З рядками символів.

# Генератор множин
# Сформувати множину з рядка символів
x = { s for s in set('abcdef')} # x = {'a', 'd', 'c', 'f', 'e', 'b'}
print('x = ', x)

y = { s*3 for s in set('1DF')}
print('y = ', y)

z = { '_'+s for s in {'j', 'k', 'l'}}
print('z = ', z)

Результат роботи програми

x = {'b', 'c', 'f', 'd', 'e', 'a'}
y = {'FFF', '111', 'DDD'}
z = {'_l', '_k', '_j'}

 


Зв’язані теми