Множества в Python. Операции над множествами
Множества — это еще одна встроенная в Python структура данных, относящаяся к коллекциям наряду со списками, словарями и кортежами. Множество неупорядоченно как словарь, изменчиво как словарь и список, содержит просто элементы как список и кортеж, а не пары ключ:значение как словарь.
Особенностью множества является уникальность каждого ее элемента. Другими словами, в списке может быть два элемента со значением, скажем, 100, а во множестве такого быть не может.
Понятие множеств пришло из математики. Также представление о множествах используют в компьютерной графике. Существуют три базовые операции, которые выполняют над множествами. Это объединение, пересечение и разность.
Допустим, у вас есть две фигуры, каждая точка которых описывается координатами. Каждая фигура определяется своим множеством точек. При объединении этих фигур во множество попадут все точки обеих фигур, но если фигуры перекрывались, то точки области перекрытия в результирующем множестве будут представлены в единственном числе.
В случае пересечения в результирующее множество попадут только точки, которые есть и у первой фигуры и у второй. Другими словами, их область перекрытия.
При нахождении разности множеств имеет значение, что из чего вычитается. В итоговое множество попадают все точки "уменьшаемого", исключая те, которые являются общими с "вычитаемым".
В языке программирования Python изменяемое множество можно создать несколькими способами. Во-первых, в фигурных скобках перечислить через запятую элементы. Во вторых, вызвать встроенную функцию set(). В третьих — использовать выражение, подобное генератору списка, но с фигурными скобками. Однако, нельзя создать пустое множество, используя пустые фигурные скобки, так как в этом случае создается пустой словарь.
>>> a = {1, 2, 3, 4, 1} >>> a {1, 2, 3, 4} >>> b = [1, 2, 3] >>> b = set(b) >>> b {1, 2, 3} >>> c = set(1, 2, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: set expected at most 1 arguments, got 3 >>> set('abc') {'b', 'c', 'a'} >>> set([1,2,4]) {1, 2, 4} >>> d = {i+1 for i in range(10)} >>> d {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Обратите внимание, во множестве a уже нет повтора единицы. В set() можно передавать только итерируемый объект, а не перечислять сами элементы.
Для операций над множествами есть специальные методы, однако также можно использовать знаки, предназначенные в Python для побитовых операций над числами, и знак минус. В случае множеств эти операции обозначают следующее:
|— объединение множеств,&— пересечение,-— разность,^— симметрическая разность.
>>> a = {'red', 'green', 'blue', 'white'} >>> b = {'black', 'white', 'blue', 'yellow', 'brown'} >>> a | b {'green', 'black', 'blue', 'red', 'yellow', 'white', 'brown'} >>> a & b {'white', 'blue'} >>> a - b {'green', 'red'} >>> b - a {'black', 'yellow', 'brown'} >>> a ^ b {'green', 'yellow', 'brown', 'black', 'red'}
Результатом объединения | (ИЛИ) является множество, содержащее элементы, которые встречаются хотя бы в одном из исходных множеств. Результатом пересечения & (И) является множество, содержащее элементы, которые встречаются в обоих исходных множествах. Результатом разности - является множество, содержащее элементы, которые есть в "уменьшаемом", но их нет в "вычитаемом". То есть уникальные для "уменьшаемого". Результат завесит от порядка операндов. Результатом симметрической разности ^ (исключающего ИЛИ) является множество, состоящее только из уникальных элементов исходных множеств. Совпадающие элементы исключаются.
Это же с помощью вызова самих методов:
>>> a.union(b) {'green', 'black', 'blue', 'red', 'yellow', 'white', 'brown'} >>> a.intersection(b) {'white', 'blue'} >>> a.difference(b) {'green', 'red'} >>> b.difference(a) {'black', 'yellow', 'brown'} >>> a.symmetric_difference(b) {'green', 'yellow', 'brown', 'black', 'red'}
Все методы объекта типа set можно посмотреть командой dir(set).
Множества, также как другие коллекции, поддерживают операцию in — проверку на вхождение элемента в структуру.
>>> 'black' in a False >>> 'black' in b True >>> 'black' not in b False
Практическая работа
Множество как структура данных подходит для хранения списка тегов. Если пользователь вводит новый тег, он добавляется во множество. Если вводит тег, который уже есть во множестве, дублирования не произойдет.
Напишите программу, в которой пользователь вводит слова. Если слово до этого не вводилось, оно добавляется ко множеству. Если слово уже было введено ранее, то пользователь получает сообщение "уже есть".