Иногда возникает необходимость проверять разные отношения между двумя наборами элементов. Например, проверить, есть ли у двух списков общие элементы. Для этого можно воспользоваться уже известным оператором in
:
L1 = [1, 3, 4]
L2 = [1, 4, 5, 6]
for i in L2:
if i in L1:
print(i)
1 4
Но иногда удобно превратить списки в множества (sets
) и выполнять операции, которые определены для множеств в математике: пересечение, объединение, разность и так далее.
set() # пустое множество
set()
set([1, 2, 6]) # множество, полученное из списка
{1, 2, 6}
Важно иметь в виду, что в множествах (как в программировании, так и в математике) не может быть повторяющихся элементов. Поэтому, если в списке есть повторяющиеся значения, и они важны, превращать спискок в множество не стоит, так как можно потерять элементы.
set([1, 2, 6, 6, 1, 2]) # потеряли повторы
{1, 2, 6}
Но зато с помощью множеств можно получить список уникальных элементов списка:
list(set([1, 2, 6, 6, 1, 2]))
[1, 2, 6]
А теперь превратим два числовых списка в множества A и B и попробуем произвести некоторые операции.
A = set([1, 2, 4, 6])
B = set([2, 3, 6, 8])
Пересечение множеств A и B – общие элементы этих двух множеств ($A \cap B$):
A.intersection(B)
{2, 6}
Объединение множеств A и B – все элементы множества A и множества B, конечно, без повторений ($A \cup B$):
A.union(B)
{1, 2, 3, 4, 6, 8}
Разность множеств A и B – все элементы множества A, которых нет в B ($A\text{\\}B$).
A.difference(B)
{1, 4}
Разность множеств B и A – все элементы множества B, которых нет в A ($B\text{\\}A$).
B.difference(A)
{3, 8}
Симметрическая разность множеств A и B – все элементы А и B, которые не входят в пересечение этих множеств:
A.symmetric_difference(B)
{1, 3, 4, 8}
Обратите внимание: результат, полученный после использования методов для множеств, тоже является множеством – элементы перечислены в фигурных скобках. Но при желании результат можно превратить в список:
list(A.symmetric_difference(B))
[1, 3, 4, 8]
На множествах определены особые методы, которые облегчают сравнение наборов элементов. Например, можно проверить, являются ли множества A и B непересекающимися (не имеющими общих элементов):
A.isdisjoint(B) # joint - пересекающиеся, disjoint - непересекающиеся
False
Или проверить, является ли множество A подмножеством B (все элементы A входят в B):
A.issubset(B)
False
Множество в Python, наверное, не такой распространенный объект как список, кортеж или словарь, но знать о них полезно, потому что в некоторых задачах использовать методы для множеств гораздо эффективнее, чем писать какие-то циклы с разными условиями.