Множество (set)
set - множество. В нем нет одинаковых элементов. Его можно изменять.
frozenset - множество. В нем нет одинаковых элементов. Его НЕЛЬЗЯ изменять.
Порядок перебора элементов множества не определен.
То есть в множестве определены операции in, len, возможен перебор for .. in, но нельзя взять i-тый элемент.
Можно взять enumerate(a)
, но порядок перебора может быть разный.
Создание множества
Множество пишем в { }.
Пустое множество:
a = set() # только так
a = {} # это НЕ множество, это словарь
Создаем множество:
a = [1, 5, 17, 5, -22, 4, 4, 4] # сделали list
print(a) # 1 5 17 5 -22 4 4 4
b = set(a) # сделали set из list
print(b) # 1 5 17 -22 4
c = {1, 5, 17, 5, -22, 4, 4, 4} # сделали set
print(c) # 1 5 17 -22 4
Что может быть элементом множества?
Только хешируемый объект. Т.е. объект, для которого определена функция __hash__() - она возвращает все время одно и то же значение на протяжении всей жизни объекта. Эти объекты можно сравнить на равенство, используя __eq__()
- int, float, str, tuple, frozenset - хешируемые объекты, могут быть добавлены в множество;
- list, dict, set - нехэшируемые, так как значение хеша зависит от значений их элементов (а они могут изменяться).
Хешируемый != неизменный. Объект класса Person может быть хешируемым, если в классе определена фукнция __hash__(). Она может возвращать, например, СНИЛС человека или любой другой его неизменяемый идентификатор. При этом данные о человеке могут меняться (например, смена фамилии).
Методы множества
a = {1, 3, 5, 11, 12, 13}
b = {5, 1, 3, 21, 22, 23}
c = {1, 3, 5}
d = {3, 1, 5}
w = {2, 8}
Операция | Значение | Результат |
---|---|---|
a.add(7) | добавить 7 в множество a | |
a.remove(5) | удалить 5 из a (если нет, KeyError exception) | {1, 3, 11, 12, 13} |
a.discard(5) | удалить 5 из a если элемент есть | {1, 3, 11, 12, 13} |
a.pop() | удаляет случайный элемент из множества (или KeyError, если множество пустое) | |
a.clear() | удалить все элементы из а | |
a.copy() | копия множества | |
len(a) | число элементов в множестве | 6 |
x in a | элемент х в множестве а | |
x not in a | элемент х НЕ в множестве а | |
a.isdisjoint(w) | True, если у множеств нет общих элементов | |
c == d | множества с и d равны | |
с < a | c содержится в множестве a, но не равно ему | |
c.issubset(a) с <= a |
c содержится в множестве a | |
a > c | a содержит в себе c | |
a.issuperset(c) a >= c |
a содержит в себе c, но не равно ему | |
a.union(b) a | b |
объединение множеств (новое) | {1, 3, 5, 11, 12, 13, 21, 22, 23} |
a.update(b) a |= b |
объединение множеств (изменяется а) | {1, 3, 5, 11, 12, 13, 21, 22, 23} |
a.intersection(b) a & b |
пересечение множеств (новое) | {1, 3, 5} |
a.intersection_update(b) a &= b |
оставляет во множестве а пересечение множеств а и b | {1, 3, 5} |
a.difference(c) a - c |
вычитание (новое множество) | {11, 12, 13} |
a.difference_update(c) a -= c |
удаляет из множества а все элементы, которые присутствуют в с | a = {11, 12, 13} |
a.symmetric_difference(b) a ^ b |
XOR (новое множество) | {11, 12, 13, 21, 22, 23} |
a.symmetric_difference_update(b) a ^= b |
XOR (изменяем а) | {11, 12, 13, 21, 22, 23} |
Применение множеств:
- убрать повторения;
- список уже обработанных имен и "уже обрабатывали?"
Если нет аргументов командной строки или указаны -h или --help:
if len(sys.argv) == 1 or sys.argv[1] in {"-h", "--help"}