Содержание

Множества и словари в Python

Содержание

  • Ссылки на контесты
  • Множества Python
    • Создание и изменение множества
    • Математические операции
      • Проверки
    • Сводная таблица по множествам (cheatsheet)
    • Неизменяемые множества
  • Словари Python
    • Создание и изменение словаря
      • Примечание о числовых ключах
    • Использование DictView: циклы и множественные операции
    • Словарь с упорядоченными ключами OrderedDict
  • Начинающие (участвовать)
  • Основные (участвовать)
  • Продвинутые (участвовать)

Множество (set) — встроенная структура данных языка Python, имеющая следующие свойства:

  • множество — это коллекция
    Множество содержит элементы
  • множество неупорядоченно
    Множество не записывает (не хранит) позиции или порядок добавления его элементов.
    Таким образом, множество не имеет свойств последовательности (например, массива): у элементов множества нет индексов, невозможно взять срез множества…
  • элементы множества уникальны
    Множество не может содержать два одинаковых элемента.
  • элементы множества — хешируемые объекты (hashable objects)
    В Python множество set реализовано с использованием хеш-таблицы. Это приводит к тому, что элементы множества должны быть неизменяемыми объектами. Например, элементом множества может быть строка, число, кортеж tuple, но не может быть список list, другое множество set

Эти свойства множеств часто используются, чтобы проверять вхождение элементов, удаление дубликатов из последовательностей, а также для математических операций пересечения, объединения, разности…

Создание и изменение множества

Запустите в терминале Python в интерпретируемом режиме и проработайте примеры ниже.

Пустое множество создаётся с помощью функции set

>>> A = set()
>>> type(A)
<class 'set'>
>>> len(A)
0
>>> A
set()

Обратите внимание, что размер множества множества можно получить с помощью функции len.

Добавим несколько элементов

>>> A.add(1)
>>> A
{1}
>>> A.add(2)
>>> A
{1, 2}
>>> A.add(2)
>>> A
{1, 2}

Заметьте, что повторное добавление не имеет никакого эффекта на множество.

Также, из вывода видно, что литералом множества являются фигурные скобки {}, в которых через запятую указаны элементы. Так, ещё один способ создать непустое множество — воспользоваться литералом

>>> B = {1, 2}
>>> B
{1, 2}

При попытке добавления изменяемого объекта возникнет ошибка

>>> B.add([3,4,5])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Здесь произошла попытка добавить массив в множество B.

У операции добавления set.add существует обратная — операция удаления set.remove

>>> B
{1, 2}
>>> B.remove(1)
>>> B
{2}
>>> B.remove(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 3

При попытке удаления элемента, не входящего в множество, возникает ошибка KeyError.

Однако, существует метод set.discard, который удаляет элемент из множества, только в том случае, если этот элемент присутствовал в нём.

Математические операции

Множества Python поддерживают привычные математические операции

Проверки

Чтобы проверить вхождение элемента в множество используйте логический оператор in

>>> B = {1, 2}
>>> B
{1, 2}
>>> 3 in B
False

Асимптотика x in set — O(1).

Стоит отметить, что оператор in работает и с другими коллекциями. Например, можно проверять вхождение подстроки в строку 'AA' in 'bbAAcc' или вхождение элемента в массив 5 in [1, 2, 5, 6]. Асимптотики в данном случае нужно уточнять в документации.

Одинаковые множества

>>> A = {1, 2, 3}
>>> B = {1, 2, 3}
>>> A == B
True
>>> B.add(4)
>>> A
{1, 2, 3}
>>> B
{1, 2, 3, 4}
>>> A == B
False

Проверка на нестрогое подмножество set.issubset

>>> A
{1, 2, 3}
>>> B
{1, 2, 3, 4}
>>> A.issubset(B)
True
>>> B.issubset(A)
False
>>> A.issubset(A)
True

Проверка на нестрогое надмножество set.issuperset

>>> A
{1, 2, 3}
>>> B
{1, 2, 3, 4}
>>> A.issuperset(B)
False
>>> B.issuperset(A)
True
>>> B.issuperset(B)
True

Операции получения новых множеств

>>> A = {1, 2, 4}
>>> B = {1, 2, 3}
>>> A.
union(B) # union - объединение множеств {1, 2, 3, 4} >>> A.intersection(B) # intersection - пересечение {1, 2} >>> A.difference(B) # difference - разность множеств {4} >>> B.difference(A) {3} >>> A.symmetric_difference(B) # symmetric_difference - симметрическая разность {3, 4} >>> B.symmetric_difference(A) {3, 4}

Сводная таблица по множествам (cheatsheet)

Обозначения

  • elem — Python-объект

  • A — множество set

  • B, C,..

    1. В случае использования в

    методах A.method_name(B, C,..): B, C,.. являются любыми итерируемыми объектами. Методы допускают такие аргументы, например, {-1}.union(range(2)) == {-1, 0, 1} вернёт True.

    2. В случае использования c операторами, например, A > B или A & B & C & …: B, C,.. являются множествами. Дело в том, что эти операторы определены для операндов типа set (и также frozenset, о которых речь позже).

ОперацияСинтаксисТип результата
Вхождение элементаelem in Abool
РавенствоA == Bbool
Является нестрогим подмножествомA.issubset(B) или A <= Bbool
Является строгим подмножествомA < Bbool
Является нестрогим надмножествомA.issuperset(B) или A >= Bbool
Явяляется строгим надмножествомA > Bbool
Объединение множествA.union(B, C,..)
set
A | B | C | …set
Пересечение множествA.intersection(B, C,..)set
A & B & C & …set
Разность множествA.set

Кроме того, у операций, порождающих новые множества, существует inplace варианты. Для методов это те же названия, только с префиксом _update, а для соответствующих операторов добавляется знак равенства =. Ниже показан вариант для операции разности множеств

>>> A = {1, 2, 3, 4}
>>> B = {2, 4}
>>> A.difference_update(B)
>>> A
{1, 3}
>>> A = {1, 2, 3, 4}
>>> B = {2, 4}
>>> A -= B
>>> A
{1, 3}

Неизменяемые множества

В Python существует неизменяемая версия множества — frozenset. Этот тип объектов поддерживает все операции обычного множества set, за исключением тех, которые его меняют.

Неизменяемые множества являются хешируемыми объектами, поэтому они могут быть элементами множества set. Так можно реализовать, например, множество множеств, где множество set состоит из множеств типа frozenset.

Для создания frozenset используется функция frozenset(iterable), в качестве аргумента принимающая итерирумый объект.

>>> FS = frozenset({1, 2, 3})
>>> FS
frozenset({1, 2, 3})
>>> A = {1, 2, 4}
>>> FS & A
frozenset({1, 2})
>>> A & FS
{1, 2}

В этом примере показано создание frozenset из обычного множества {1, 2, 3}. Обратите внимание на тип возвращаемого объекта для операции пересечения &. Возвращаемый объект имеет тип, соответствующий типу первого аргумента. Такое же поведение будет и с другими операциями над множествами.

Словарь (dictionary) в Python — это ассоциативный массив, реализовать который вы пробовали на прошлом занятии. Ассоциативный массив это структура данных, содержащая пары вида ключ:значение. Ключи в ассоциативном массиве уникальны.

В Python есть встроенный ассоциативный массив — dict. Его реализация основана на хеш-таблицах. Поэтому

  • ключом может быть только хешируемый объект
  • значением может быть любой объект

Создание и изменение словаря

Пустой словарь можно создать двумя способами:

>>> d1 = dict()
>>> d2 = {}
>>> d1
{}
>>> d2
{}
>>> type(d1)
<class 'dict'>
>>> type(d2)
<class 'dict'>

Добавить элемент в словарь можно с помощью квадратных скобок:

>>> domains = {}
>>> domains['ru'] = 'Russia'
>>> domains['com'] = 'commercial'
>>> domains['org'] = 'organizations'
>>> domains
{'ru': 'Russia', 'com': 'commercial', 'org': 'organizations'}

Из этого примера видно, что литералом словаря являются фигурные скобки, в которых через запятую перечислены пары в формате ключ:значение. Например, словарь domains можно было создать так domains = {'ru': 'Russia', 'com': 'commercial', 'org': 'organizations'}.

Доступ к элементу осуществляется по ключу:

>>> domains['com']
'commercial'
>>> domains['de']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'de'

Удалить элемент можно с помощью оператора del. Если ключа в словаре нет, произойдет ошибка KeyError

>>> domains
{'ru': 'Russia', 'com': 'commercial', 'org': 'organizations'}
>>> del domains['de']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'de'
>>> del domains['ru']
>>> domains
{'com': 'commercial', 'org': 'organizations'}

Кроме того, для добавления, получения и удаления элементов есть методы dict.setdefault, dict.get, dict.pop, которые задействует дополнительный аргумент на случай, если ключа в словаре нет

>>> d1 = {}
>>> d1.setdefault('a', 10)
10
>>> d1. setdefault('b', 20)
20
>>> d1
{'a': 10, 'b': 20}
>>> d1.setdefault('c')
>>> d1
{'a': 10, 'b': 20, 'c': None}
>>> d1.setdefault('a', 123)
10
>>> d1
{'a': 10, 'b': 20, 'c': None}
>>> d1.get('a')
10
>>> d1.get('d')  # вернул None
>>> d1.get('d', 'NoKey')
'NoKey'
>>> d1.pop('d')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'd'
>>> d1.pop('d', 255)
255
>>> d1
{'a': 10, 'b': 20, 'c': None}
>>> d1.pop('a', 255)
10
>>> d1
{'b': 20, 'c': None}
Примечание о числовых ключах

Ключом может являться и число: int или float. Однако при работе со словарями в Python помните, что два ключа разные, если для них верно k1 != k2 # True.

Вот пример:

>>> d = {0: 10}
>>> d
{0: 10}
>>> d[0] = 22
>>> d
{0: 22}
>>> d[0.0] = 33
>>> d
{0: 33}
>>> 0. 0 != 0
False

Поэтому при возможности избегайте в качестве ключей float-объектов.

Использование DictView: циклы и множественные операции

Если попробовать пройтись в цикле по словарю, то это будет проход по ключам

>>> d = {'a': 10, 'c': 30, 'b': 20}
>>> for k in d:
...     print(k)
...
a
c
b

Зачастую необходимо пройтись в цикле по ключам, значениям или парам ключ:значение, содержащиеся в словаре. Для этого существуют методы dict.keys(), dict.values(), dict.items(). Они возвращают специальные DictView объекты, которые можно использовать в циклах:

>>> d = {'a': 10, 'c': 30, 'b': 20}
>>> for k in d.keys():
...     print(k)
...
a
c
b
>>> for v in d.values():
...     print(v)
...
10
30
20
>>> for k, v in d.items():
...     print(k, v)
...
a 10
c 30
b 20

Объекты DictView, содержащие только ключи, ведут себя подобно множествам. Кроме того, если DictView объекты для значений или пар содержат неизменяемые объекты, тогда они тоже ведут себя подобно множествам. Это означает, что привычные для множеств операции пересечения, вхождения и другие также работают с DictView.

>>> d
{'a': 10, 'c': 30, 'b': 20}
>>> dkeys = d.keys()
>>> 'abc' in dkeys
False
>>> 'c' in dkeys
True
>>> {'a', 'b', 'c'} == dkeys
True
>>> dkeys & {'b', 'c', 'd'}
{'b', 'c'}

Словарь с упорядоченными ключами OrderedDict

Это может понадобится для отправки задач на ejudge.

Если внимательно просмотреть примеры на циклы выше, то видно, что порядок итерирования в циклах совпадает с порядком добавления элементов в словарь.

Однако, такое поведение у стандартных словарей dict гарантируется, начиная с версии 3.7 (лабораторные примеры были сделаны из-под версии 3.7.4). Узнать свою версию Python можно, например, из терминала python3 —version или зайдя в интерпретируемый режим (версия будет написана сверху).

Если для вашей программы важно упорядочивание элементов, но вы не знаете, какой версии интерпретатор будет исполнять ваш скрипт, то вам нужно воспользоваться упорядоченной версией словарей OrderedDict.

Она находится в стандартной библиотеке collections.

Упорядоченный словарь поддерживает все операции, что и обычный словарь.

>>> import collections
>>> od = collections.OrderedDict()
>>> od
OrderedDict()
>>> od['a'] = 10
>>> od['c'] = 30
>>> od['b'] = 20
>>> od
OrderedDict([('a', 10), ('c', 30), ('b', 20)])

Python | Множества

Последнее обновление: 31.06.2017

Множество (set) представляют еще один вид набора, который хранит только уникальные элементы. Для определения множества используются фигурные скобки, в которых перечисляются элементы:


users = {"Tom", "Bob", "Alice", "Tom"}
print(users)	# {"Alice", "Bob", "Tom"}

Обратите внимание, что несмотря на то, что функция print вывела один раз элемент «Tom», хотя в определении множества этот элемент содержится два раза. Все потому что множество содержит только уникальные значения.

Также для определения множества может применяться функция set(), в которую передается список или кортеж элементов:


people = ["Mike", "Bill", "Ted"]
users = set(people)
print(users)    # {"Mike", "Bill", "Ted"}

Функцию set удобно применять для создания пустого множества:


users = set()

Для получения длины множества применяется встроенная функция len():


users = {"Tom", "Bob", "Alice"}
print(len(users))   	# 3


Добавление элементов

Для добавления одиночного элемента вызывается метод add():


users = set()
users.add("Sam")
print(users)

Удаление элементов

Для удаления одного элемента вызывается метод remove(), в который передается удаляемый элемент. Но следует учитывать, что если такого элемента не окажется в множестве, то будет сгенерирована ошибка. Поэтому перед удалением следует проверять на наличие элемента с помощью оператора in:


users = {"Tom", "Bob", "Alice"}

user = "Tom"
if user in users: 
    users. remove(user)
print(users)	# {"Bob", "Alice"}

Также для удаления можно использовать метод discard(), который не будет генерировать исключения при отсутствии элемента:


users = {"Tom", "Bob", "Alice"}

users.discard("Tim")    # элемент "Tim" отсутствует, и метод ничего не делает
print(users)    #  {"Tom", "Bob", "Alice"}

users.discard("Tom")    # элемент "Tom" есть, и метод удаляет элемент
print(users)    #  {"Bob", "Alice"}

Для удаления всех элементов вызывается метод clear():


users.clear()

Перебор множества

Для перебора элементов можно использовать цикл for:


users = {"Tom", "Bob", "Alice"}

for user in users:
    print(user)

При переборе каждый элемент помещается в переменную user.

Операции с множествами

С помощью метода copy() можно скопировать содержимое одного множества в другую переменную:


users = {"Tom", "Bob", "Alice"}
students = users. copy()
print(students)     # {"Tom", "Bob", "Alice"}

Объединение множеств

Метод union() объединяет два множества и возвращает новое множество:


users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}

users3 = users.union(users2)
print(users3)   # {"Bob", "Alice", "Sam", "Kate", "Tom"}

Пересечение множеств

Пересечение множеств позволяет получить только те элементы, которые есть одновременно в обоих множествах. Метод intersection() производит операцию пересечения множеств и возвращает новое множество:


users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}

users3 = users.intersection(users2)
print(users3)   # {"Bob"}

Вместо метода intersection мы могли бы использовать операцию логического умножения:


users = {"Tom", "Bob", "Alice"}
users2 = {"Sam", "Kate", "Bob"}

print(users & users2)   # {"Bob"}

В этом случае мы получили бы тот же результат. users2 print(users4) # {«Tom», «Alice», «Sam», «Kate»}

Отношения между множествами

Метод issubset позволяет выяснить, является ли текущее множество подмножеством (то есть частью) другого множества:


users = {"Tom", "Bob", "Alice"}
superusers = {"Sam", "Tom", "Bob", "Alice", "Greg"}

print(users.issubset(superusers))   # True
print(superusers.issubset(users))   # False

Метод issuperset, наоборот, возвращает True, если текущее множество является надмножеством (то есть содержит) для другого множества:


users = {"Tom", "Bob", "Alice"}
superusers = {"Sam", "Tom", "Bob", "Alice", "Greg"}

print(users.issuperset(superusers))   # False
print(superusers.issuperset(users))   # True

frozen set

Тип frozen set является видом множеств, которое не может быть изменено. Для его создания используется функция frozenset:

users = frozenset({"Tom", "Bob", "Alice"})

В функцию frozenset передается набор элементов — список, кортеж, другое множество.

В такое множество мы не можем добавить новые элементы, как и удалить из него уже имеющиеся. Собственно поэтому frozen set поддерживает ограниченный набор операций:

  • len(s): возвращает длину множества

  • x in s: возвращает True, если элемент x присутствует в множестве s

  • x not in s: возвращает True, если элемент x отсутствует в множестве s

  • s.issubset(t): возвращает True, если t содержит множество s

  • s.issuperset(t): возвращает True, если t содержится в множестве s

  • s.union(t)

    : возвращает объединение множеств s и t
  • s.intersection(t): возвращает пересечение множеств s и t

  • s.difference(t): возвращает разность множеств s и t

  • s.copy(): возвращает копию множества s

НазадСодержаниеВперед

Python Sets

❮ Предыдущая Далее ❯


myset = {«яблоко», «банан», «вишня»}


Набор

Наборы используются для хранения нескольких элементов в одной переменной.

Set — один из 4 встроенных типов данных в Python, используемых для хранения коллекций данные, остальные 3 — список, Tuple и Dictionary, все с разными качествами и использованием.

Набор — это набор, состоящий из неупорядоченных , неизменяемых* и неиндексированных .

* Примечание: Set Элементы неизменны, но их можно удалить элементы и добавлять новые элементы.

Наборы пишутся с фигурными скобками.

Пример

Создать набор:

thisset = {«яблоко», «банан», «вишня»}
print(thisset)

Попробуйте сами »

Примечание: Наборы неупорядочены, поэтому вы не можете быть уверенным в том, в каком заказ элементы появятся.


Элементы набора

Элементы набора неупорядочены, неизменяемы и не допускают дублирования значений.


Неупорядоченный

Неупорядоченный означает, что элементы в наборе не имеют определенного порядка.

Предметы набора могут появляться в другом порядке каждый раз, когда вы их используете, и на него нельзя ссылаться по индексу или ключу.


Неизменяемый

Элементы набора неизменны, это означает, что мы не можем изменить элементы после создания набора.

После создания набора вы не можете изменять его элементы, но можете удалять элементы и добавить новые элементы.


Дубликаты не допускаются

Наборы не могут содержать два элемента с одинаковым значением.

Пример

Повторяющиеся значения будут игнорироваться:

thisset = {«яблоко», «банан», «вишня», «яблоко»}

print(thisset)

Попробуйте сами »

Примечание: Значения Верно и 1 считаются одинаковыми значениями в наборах, и рассматриваются как дубликаты:

Example

True и 1 считается тем же значением:

thisset = {«яблоко», «банан», «вишня», True, 1, 2}

print(thisset)

Попробуйте сами »



Получение длины набора

Чтобы определить количество предметов в наборе, используйте len() функция.

Пример

Получить количество предметов в наборе:

thisset = {«яблоко», «банан», «вишня»}

print(len(thisset))

Попробуйте сами »


Элементы набора — типы данных

Элементы набора могут иметь любой тип данных:

Пример

Строковые, целочисленные и логические типы данных:

set1 = {«яблоко», «банан», «вишня»}
set2 = {1, 5, 7, 9, 3}
set3 = {True, False, False}

Попробуйте сами »

Набор может содержать различные типы данных:

Пример

Набор со строками, целыми числами и логические значения:

set1 = {«abc», 34, True, 40, «мужской»}

Попробуйте сами »


type()

С точки зрения Python множества определяются как объекты с типом данных ‘set’:

Пример

Каков тип данных множества?

myset = {«яблоко», «банан», «вишня»}
print(type(myset))

Попробуйте сами »


Конструктор set()

Также можно использовать set( ) конструктор, чтобы сделать набор.

Пример

Использование конструктора set() для создания набора:

thisset = set((«apple», «banana», «cherry»)) # обратите внимание на двойные круглые скобки четыре типа данных коллекций в языке программирования Python:

  • Список представляет собой упорядоченную и изменяемую коллекцию. Позволяет дублировать участников.
  • Кортеж – это упорядоченная и неизменяемая коллекция. Позволяет дублировать участников.
  • Набор — это неупорядоченная, неизменяемая* и неиндексированная коллекция. Нет повторяющихся членов.
  • Словарь это сборник, который заказывается** и изменчивый. Нет повторяющихся членов.

*Set элементы неизменяемы, но можно удалять элементы и добавлять новые предметы.

**Начиная с Python версии 3.7, словари упорядочены . В Python 3.6 и более ранних версиях словари неупорядочены .

При выборе типа коллекции полезно понимать свойства этого типа. Выбор правильного типа для определенного набора данных может означать сохранение смысла, а также повышение эффективности или безопасности.


❮ Предыдущий Далее ❯


8.7. наборы — неупорядоченные наборы уникальных элементов — документация по Python 2.7.18

Новое в версии 2.3.

Устарело, начиная с версии 2.6: встроенный набор / замороженный набор 9Типы 0081 заменяют этот модуль.

Модуль устанавливает , предоставляет классы для создания и управления неупорядоченные наборы уникальных элементов. Обычное использование включает членство тестирование, удаление дубликатов из последовательности и вычисление стандартной математики операции над множествами, такие как пересечение, объединение, разность и симметрия разница.

Как и другие коллекции, наборы поддерживают x в наборе , len(set) и для x в набор . Будучи неупорядоченной коллекцией, наборы не записывают позицию элемента или порядок вставки. Соответственно, наборы не поддерживают индексирование, нарезку или другое похожее на последовательность поведение.

Большинство установленных приложений используют класс Set , который предоставляет все методы установки кроме __hash__() . Для расширенных приложений, требующих хеш-метода, класс ImmutableSet добавляет метод __hash__() , но опускает методы которые изменяют содержимое набора. Оба набора и ImmutableSet происходит от BaseSet , абстрактного класса, полезного для определения того, что-то представляет собой набор: isinstance(obj, BaseSet) .

Классы набора реализованы с помощью словарей. Соответственно, требования к элементам множества такие же, как и к ключам словаря; а именно, что элемент определяет как __eq__() , так и __hash__() . Как результат, наборы не могут содержать изменяемые элементы, такие как списки или словари. Однако, они могут содержать неизменяемые коллекции, такие как кортежи или экземпляры Неизменяемый набор . Для удобства реализации наборов наборов внутренние наборы автоматически преобразуются в неизменяемую форму, например, Set([Set(['dog'])]) преобразуется в Set([ImmutableSet(['dog'])]) .

класс комплектов. Установить ([ итерируемый ])

Создает новый пустой объект Set . Если необязательный iterable предоставляется, обновляет набор элементами, полученными в результате итерации. Все элементы в iterable должны быть неизменяемыми или трансформироваться в immutable с использованием протокола, описанного в разделе Протокол для автоматического преобразования в immutable.

класс комплектов. ImmutableSet ([ итерируемый ])

Создает новый пустой объект ImmutableSet . Если необязательный iterable предоставляется, обновляет набор элементами, полученными в результате итерации. Все элементы в iterable должны быть неизменяемыми или трансформироваться в immutable с использованием протокола, описанного в разделе Протокол для автоматического преобразования в immutable.

Поскольку объектов ImmutableSet предоставляют метод __hash__() , они могут использоваться как элементы набора или как ключи словаря. Неизменяемый набор объекты не имеют методов добавления или удаления элементов, поэтому все элементы должны быть известны при вызове конструктора.

8.7.1. Set Objects

Экземпляры Set и ImmutableSet обеспечивают следующее операции:

Эксплуатация

Эквивалент

Результат

линзы

количество элементов в наборе с (мощность)

х в с

тест x на принадлежность к s

х нет в с

тест x на не принадлежность к с

s. issubset(t)

с <= т

проверить, каждый ли элемент в с в т

s.issuperset(t)

с >= т

проверить, каждый ли элемент в т находится в с

с.союз(т)

с | т

новый набор с элементами обоих с и т

с.пересечение(т)

с и т

новый набор с элементами, общими для с и т

новый набор с элементами в любом s или t , но не оба

s.copy()

новый набор с мелкой копией с

Обратите внимание, неоператорские версии union() , пересечение() , разность() и симметричная_разница() примут любую итерацию как Аргумент. Напротив, их коллеги на основе оператора требуют, чтобы их аргументы должны быть множествами. Это исключает подверженные ошибкам конструкции, такие как Set('abc') & 'cbs' в пользу более читаемого Установить('abc').intersection('cbs') .

Изменено в версии 2.3.1: Раньше все аргументы должны были быть установлены.

Кроме того, как Set , так и ImmutableSet поддерживают set to set сравнения. Два множества равны тогда и только тогда, когда каждый элемент каждого множества равен содержится в другом (каждое является подмножеством другого). Набор меньше, чем другой набор тогда и только тогда, когда первый набор является правильным подмножеством второго набора (является подмножеством, но не равно). Множество больше другого множества тогда и только тогда если первое множество является правильным надмножеством второго множества (является надмножеством, но не равный).

Сравнение подмножества и сравнения на равенство не приводит к полному упорядочению функция. Например, любые два непересекающихся множества не равны и не являются подмножествами. друг от друга, поэтому все следующих возвращают False : a , a==b , или а>б . Соответственно, наборы не реализуют метод __cmp__() .

Поскольку наборы определяют только частичный порядок (отношения подмножества), выходные данные список .sort() 9Метод 0081 не определен для списков наборов.

В следующей таблице перечислены операции, доступные в ImmutableSet , но не найдено в наборе :

Операция

Результат

хэш(и)

возвращает хеш-значение для с

В следующей таблице перечислены операции, доступные в Установить , но не найти в ImmutableSet :

Операция

Эквивалент

Результат

с. обновление(т)

с |= т

возвратный комплект s с элементами добавлено с т

s.intersection_update(t)

с &= т

набор возврата с только сохранение элементы также встречаются в t

s.difference_update(t)

с -= т

возврат набора с после снятия элементы найдены в т

9= т

возвратный комплект s с элементами от s или t , но не оба

с.доп(х)

добавить элемент x в набор s

s.remove(x)

удалить x из набора s ; поднимает KeyError если нет

s. discard(x)

удаляет x из набора s , если настоящее время

s.pop()

удалить и вернуть произвольное элемент из s ; поднимает KeyError если пусто

s.clear()

удалить все элементы из набора с

Обратите внимание, неоператорские версии update() , traffic_update() , разность_обновления() и симметричная_разница_обновление() примет любая итерация в качестве аргумента.

Изменено в версии 2.3.1: Раньше все аргументы должны были быть установлены.

Также обратите внимание, что модуль также включает метод union_update() , который является псевдоним для update() . Метод включен для обратной совместимости. Программисты должны предпочесть метод update() , потому что он поддерживается встроенные типы set() и frostset() .

8.7.2. Пример

 >>> из наборов импорта Set
>>> инженеры = Set(['Джон', 'Джейн', 'Джек', 'Дженис'])
>>> Programmers = Set(['Джек', 'Сэм', 'Сьюзен', 'Дженис'])
>>> менеджеры = Set(['Джейн', 'Джек', 'Сьюзен', 'Зак'])
>>> сотрудники = инженеры | программисты | менеджеры # профсоюз
>>> engineering_management = инженеры и менеджеры # пересечение
>>> fulltime_management = менеджеры - инженеры - программисты # разница
>>> Engineers.add('Марвин') # добавить элемент
>>> инженеры-печатники
Set(['Джейн', 'Марвин', 'Дженис', 'Джон', 'Джек'])
>>> employee.issuperset(engineers) # тест надмножества
ЛОЖЬ
>>> employee.update(engineers) # обновление из другого набора
>>> employee.issuperset(инженеры)
Истинный
>>> для группы в [инженеры, программисты, менеджеры, сотрудники]:
... group.discard('Susan') # безоговорочно удалить элемент
... группа печати
...
Set(['Джейн', 'Марвин', 'Дженис', 'Джон', 'Джек'])
Установить(['Дженис', 'Джек', 'Сэм'])
Установить(['Джейн', 'Зак', 'Джек'])
Set(['Джек', 'Сэм', 'Джейн', 'Марвин', 'Дженис', 'Джон', 'Зак'])
 

8.

7.3. Протокол автоматического преобразования в неизменяемые

Наборы могут содержать только неизменяемые элементы. Для удобства сменный Комплект объекты автоматически копируются в ImmutableSet перед добавлением как элемент набора.

Механизм заключается в том, чтобы всегда добавлять хешируемый элемент, а если нет hashable, элемент проверяется на наличие __as_immutable__() метод, который возвращает неизменяемый эквивалент.

С Объекты Set имеют метод __as_immutable__() , возвращающий экземпляр ImmutableSet , можно создавать наборы наборов.

Аналогичный механизм необходим для __contains__() и remove() методы, которым необходимо хешировать элемент для проверки на принадлежность к набору. Те методы проверяют элемент на хешируемость и, если нет, проверяют наличие __as_temporaries_immutable__() метод, который возвращает элемент, обернутый класс, предоставляющий временные методы для __хэш__() , __eq__() , и __ne__() .

Альтернативный механизм избавляет от необходимости создавать отдельную копию оригинала изменяемый объект.

Объекты Set реализуют метод __as_temporarially_immutable__() который возвращает объект Set , обернутый новым классом _Временно неизменяемый набор .

Два механизма добавления возможности хеширования обычно невидимы для пользователя; однако конфликт может возникнуть в многопоточной среде, где один поток обновляет набор, в то время как другой временно завернул его в _Временно неизменяемый набор . Другими словами, множества изменяемых множеств не являются потокобезопасный.

8.7.4. Сравнение со встроенным набором

типов

уроки, извлеченные из модуля комплектов . Ключевые отличия:

  • Set и ImmutableSet были переименованы в set и замороженный комплект .

  • Нет эквивалента BaseSet .