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

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

Допустим, у нас есть три следующих множества:

>>> X = {'A', 'P', 'I', 'B', 'E', 'H', 'C', 'G', 'O', 'R', 'K', 'N'}
>>> Y = {'A', 'J', 'S', 'P', 'I', 'L', 'D', 'C', 'G', 'Q', 'F', 'N'}
>>> Z = {'A', 'J', 'N', 'B', 'U', 'T', 'H', 'D', 'G', 'Q', 'O', 'M'}

Данные множества могут обозначать совершенно разные сущности, из абсолютно произвольных областей, например X, Y и Z могут обозначать какие-нибудь заболевания, допустим рак легкого, пневмония и астма. Тогда, выполняя определенные операции над этими множествами, можно выяснить кто из этих людей перенес несколько заболеваний. Пример, конечно, не очень жизнерадостный, но вы и сами можете придумать целое множество других примеров.

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

>>> X & Y & Z
{'A', 'N', 'G'}

Данному результату соответствует следующая диаграмма Вена:

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

Что бы найти элементы, которые являются общими как минимум для двух множеств т.е. \(((X \cap Y) \cup (X \cap Z) \cup (Y \cap Z)) \setminus (X \cap Y \cap Z)\), можно выполнить следующую операцию:

>>> ((X & Y) | (X & Z) | (Y & Z)) - (X & Y & Z)
{'J', 'B', 'I', 'P', 'H', 'D', 'C', 'O', 'Q'}

Диаграмма Вена для данного результата будет выглядеть так:

Разность объединения попарных пересечений и пересечения трех множеств в Python

Выражение \(((X \cap Y) \cup (X \cap Z) \cup (Y \cap Z))\) соответствует всем элементам, которые являются общими минимум для двух множеств:

>>> ((X & Y) | (X & Z) | (Y & Z))
{'A', 'J', 'P', 'I', 'B', 'H', 'D', 'C', 'G', 'O', 'Q', 'N'}

Объединения попарных пересечений трех множеств в Python

Элементы, которые не являются общими могут быть найдены так:

>>> (X ^ Y ^ Z) - (X & Y & Z)
{'S', 'U', 'T', 'L', 'E', 'R', 'F', 'K', 'M'}

И выглядеть так:

Уникальные элементы трех множеств в Python

В общем, с помощью операций над множествами, можно находить даже очень сложные подмножества:

>>> (Y & Z) | ((X - Y) - Z)
{'A', 'J', 'E', 'D', 'G', 'Q', 'R', 'K', 'N'}

Пересечение двух множеств и уникальные элементы третьего в Python