-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path08_sets_tutorial.py
More file actions
174 lines (134 loc) · 6.5 KB
/
08_sets_tutorial.py
File metadata and controls
174 lines (134 loc) · 6.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# 1. Создание множеств (sets)
# Множество - неупорядоченная коллекция уникальных элементов
empty_set = set() # Внимание! {} создает пустой СЛОВАРЬ, а не множество
numbers = {1, 2, 3, 4, 5}
mixed = {1, "текст", 3.14, True}
print(f"Множество: {numbers}")
# Из списка (автоматически удаляет дубликаты!)
list_with_duplicates = [1, 2, 2, 3, 3, 3, 4]
unique_numbers = set(list_with_duplicates)
print(f"Уникальные из списка: {unique_numbers}")
# 2. Добавление элементов
fruits = {"яблоко", "банан"}
# add() - добавить один элемент
fruits.add("апельсин")
print(f"После add: {fruits}")
# Попытка добавить дубликат (ничего не изменится)
fruits.add("яблоко")
print(f"После добавления дубликата: {fruits}")
# update() - добавить несколько элементов
fruits.update(["груша", "киви", "банан"])
print(f"После update: {fruits}")
# 3. Удаление элементов
numbers = {1, 2, 3, 4, 5}
# remove() - удалить элемент (ошибка, если элемента нет)
numbers.remove(3)
print(f"После remove(3): {numbers}")
# discard() - удалить элемент (БЕЗ ошибки, если элемента нет)
numbers.discard(10) # Нет ошибки
print(f"После discard(10): {numbers}")
# pop() - удалить и вернуть случайный элемент
element = numbers.pop()
print(f"Удалили: {element}, осталось: {numbers}")
# clear() - очистить множество
numbers.clear()
print(f"После clear: {numbers}")
# 4. Операции над множествами
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# Объединение (union) - все элементы из обоих множеств
union = set1 | set2
# или
union = set1.union(set2)
print(f"Объединение: {union}")
# Пересечение (intersection) - только общие элементы
intersection = set1 & set2
# или
intersection = set1.intersection(set2)
print(f"Пересечение: {intersection}")
# Разность (difference) - элементы из первого, которых нет во втором
difference = set1 - set2
# или
difference = set1.difference(set2)
print(f"Разность set1 - set2: {difference}")
difference = set2 - set1
print(f"Разность set2 - set1: {difference}")
# Симметрическая разность (symmetric difference) - элементы, которые есть только в одном множестве
sym_diff = set1 ^ set2
# или
sym_diff = set1.symmetric_difference(set2)
print(f"Симметрическая разность: {sym_diff}")
# 5. Проверка вхождения
numbers = {1, 2, 3, 4, 5}
print(f"3 in numbers: {3 in numbers}") # True
print(f"10 in numbers: {10 in numbers}") # False
print(f"10 not in numbers: {10 not in numbers}") # True
# 6. Подмножества и надмножества
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5}
# issubset() - является ли подмножеством
print(f"set1.issubset(set2): {set1.issubset(set2)}") # True (все элементы set1 есть в set2)
# issuperset() - является ли надмножеством
print(f"set2.issuperset(set1): {set2.issuperset(set1)}") # True
# isdisjoint() - нет общих элементов
set3 = {6, 7, 8}
print(f"set1.isdisjoint(set3): {set1.isdisjoint(set3)}") # True (нет общих элементов)
# 7. Модификация множества на месте
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# update() / |= - добавить элементы из другого множества
set1.update(set2)
# или
# set1 |= set2
print(f"После update: {set1}")
# intersection_update() / &= - оставить только общие элементы
set1 = {1, 2, 3}
set1.intersection_update(set2)
print(f"После intersection_update: {set1}")
# difference_update() / -= - удалить элементы, которые есть в другом множестве
set1 = {1, 2, 3, 4, 5}
set1.difference_update(set2)
print(f"После difference_update: {set1}")
# symmetric_difference_update() / ^= - оставить элементы, которые есть только в одном множестве
set1 = {1, 2, 3}
set1.symmetric_difference_update(set2)
print(f"После symmetric_difference_update: {set1}")
# 8. Итерация по множеству
fruits = {"яблоко", "банан", "апельсин"}
print("Элементы множества:")
for fruit in fruits:
print(f" {fruit}")
# Внимание! Порядок элементов не гарантирован (множество неупорядоченное)
# 9. Длина множества
print(f"len(fruits): {len(fruits)}")
# 10. Копирование множества
original = {1, 2, 3}
copy = original.copy()
copy.add(4)
print(f"original: {original}, copy: {copy}")
# 11. Frozen sets (неизменяемые множества)
# frozenset - неизменяемая версия set, может быть ключом словаря
frozen = frozenset([1, 2, 3])
print(f"Frozen set: {frozen}")
# frozen.add(4) # AttributeError: 'frozenset' object has no attribute 'add'
# Использование как ключа словаря
dict_with_set_key = {
frozen: "Это работает!",
# {1, 2, 3}: "Это не работает" # TypeError: unhashable type: 'set'
}
print(f"Словарь с frozenset ключом: {dict_with_set_key}")
# 12. Практические примеры использования множеств
# Пример 1: Удаление дубликатов
numbers = [1, 2, 2, 3, 3, 3, 4, 5, 5]
unique = list(set(numbers))
print(f"Уникальные числа: {unique}")
# Пример 2: Проверка на уникальность
def has_duplicates(items):
return len(items) != len(set(items))
print(f"[1,2,3] имеет дубликаты: {has_duplicates([1, 2, 3])}") # False
print(f"[1,2,2,3] имеет дубликаты: {has_duplicates([1, 2, 2, 3])}") # True
# Пример 3: Поиск общих элементов в списках
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
common = set(list1) & set(list2)
print(f"Общие элементы: {common}")