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'}

 


Связанные темы