Skip to content

Commit 25f29a2

Browse files
committed
fix set operators
1 parent e8a0103 commit 25f29a2

File tree

1 file changed

+102
-88
lines changed

1 file changed

+102
-88
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,25 @@
11
{
2-
"metadata": {
3-
"language_info": {
4-
"codemirror_mode": {
5-
"name": "ipython",
6-
"version": 3
7-
},
8-
"file_extension": ".py",
9-
"mimetype": "text/x-python",
10-
"name": "python",
11-
"nbconvert_exporter": "python",
12-
"pygments_lexer": "ipython3",
13-
"version": "3.9.0-final"
14-
},
15-
"orig_nbformat": 2,
16-
"kernelspec": {
17-
"name": "python3",
18-
"display_name": "Python 3"
19-
}
20-
},
21-
"nbformat": 4,
22-
"nbformat_minor": 2,
232
"cells": [
243
{
4+
"cell_type": "markdown",
5+
"metadata": {},
256
"source": [
267
"# Множества (```set```)\n",
278
"\n",
289
"Множества в Python полностью аналогичны одноименным математическим объектам. Множества -- это неупорядоченный набор уникальных элементов. В Python они представлены типом ```set```. Литералами множеств являются фигурные скобки, в точности как в математической нотации. Однако нельзя создать пустое множество с помощью выражения ```{}```, в этом случае будет создан пустой словарь. Пустое множество можно создать используя вызов функции ```set()```."
29-
],
30-
"cell_type": "markdown",
31-
"metadata": {}
10+
]
3211
},
3312
{
3413
"cell_type": "code",
35-
"execution_count": 7,
14+
"execution_count": 1,
3615
"metadata": {},
3716
"outputs": [
3817
{
39-
"output_type": "stream",
4018
"name": "stdout",
19+
"output_type": "stream",
4120
"text": [
42-
"a = set(), type(a) = <class 'set'>\nb = {1, 2, 3}, type(b) = <class 'set'>\n"
21+
"a = set(), type(a) = <class 'set'>\n",
22+
"b = {1, 2, 3}, type(b) = <class 'set'>\n"
4323
]
4424
}
4525
],
@@ -51,20 +31,20 @@
5131
]
5232
},
5333
{
34+
"cell_type": "markdown",
35+
"metadata": {},
5436
"source": [
5537
"Элементы множества должны быть хешируемыми, это означает, что в множествах можно хранить только неизменяемые типы. При этом само множество является изменяемым типом, а значит нехешируемо. Обратите внимание, что кортежи являются хешируемыми, только в том случае, если все их элементы хешируемы. В примере ниже в запись множества были добавлены элементы ```1``` и ```True```, которые являются эквивалентными. Поэтому при создании множества объект ```True``` был исключен как дубликат."
56-
],
57-
"cell_type": "markdown",
58-
"metadata": {}
38+
]
5939
},
6040
{
6141
"cell_type": "code",
62-
"execution_count": 8,
42+
"execution_count": 2,
6343
"metadata": {},
6444
"outputs": [
6545
{
66-
"output_type": "stream",
6746
"name": "stdout",
47+
"output_type": "stream",
6848
"text": [
6949
"a = {False, 1, 2.0, (1, 2, 3), None, (3+4j), <class 'tuple'>, 'monty_python'}\n"
7050
]
@@ -82,20 +62,20 @@
8262
]
8363
},
8464
{
65+
"cell_type": "markdown",
66+
"metadata": {},
8567
"source": [
8668
"Такое поведение делает из множеств отличный инструмент для удаления дубликатов (поиск уникальных элементов) из последовательностей."
87-
],
88-
"cell_type": "markdown",
89-
"metadata": {}
69+
]
9070
},
9171
{
9272
"cell_type": "code",
93-
"execution_count": 9,
73+
"execution_count": 3,
9474
"metadata": {},
9575
"outputs": [
9676
{
97-
"output_type": "stream",
9877
"name": "stdout",
78+
"output_type": "stream",
9979
"text": [
10080
"set(a) = {3, 1, 42, 2}\n"
10181
]
@@ -107,22 +87,22 @@
10787
]
10888
},
10989
{
90+
"cell_type": "markdown",
91+
"metadata": {},
11092
"source": [
11193
"## Операции со множествами\n",
11294
"\n",
11395
"Можно узнать длину множества с помощью стандартной функции ```len```."
114-
],
115-
"cell_type": "markdown",
116-
"metadata": {}
96+
]
11797
},
11898
{
11999
"cell_type": "code",
120-
"execution_count": 10,
100+
"execution_count": 4,
121101
"metadata": {},
122102
"outputs": [
123103
{
124-
"output_type": "stream",
125104
"name": "stdout",
105+
"output_type": "stream",
126106
"text": [
127107
"len(a) = 3\n"
128108
]
@@ -134,32 +114,32 @@
134114
]
135115
},
136116
{
117+
"cell_type": "markdown",
118+
"metadata": {},
137119
"source": [
138120
"Множества в Python реализованы на основе хэш-таблиц. В связи с этим множества являются неупорядоченными коллекциями. Это приводит к тому, что во множествах нельзя обращаться к элементу по индексу и нельзя брать срез. "
139-
],
140-
"cell_type": "markdown",
141-
"metadata": {}
121+
]
142122
},
143123
{
144124
"cell_type": "code",
145-
"execution_count": 2,
125+
"execution_count": 5,
146126
"metadata": {},
147127
"outputs": [
148128
{
149-
"output_type": "stream",
150129
"name": "stdout",
130+
"output_type": "stream",
151131
"text": [
152-
"b = {0, 3, 'abc', -1, 42, '0'}\n"
132+
"b = {0, 3, 42, '0', -1, 'abc'}\n"
153133
]
154134
},
155135
{
156-
"output_type": "error",
157136
"ename": "TypeError",
158137
"evalue": "'set' object is not subscriptable",
138+
"output_type": "error",
159139
"traceback": [
160140
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
161141
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
162-
"\u001b[1;32m<ipython-input-2-c7187d732e17>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m42\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'abc'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'0'\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf'{b = }'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf'{b[0] = }'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
142+
"\u001b[1;32m<ipython-input-5-c7187d732e17>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m42\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'abc'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'0'\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf'{b = }'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mf'{b[0] = }'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
163143
"\u001b[1;31mTypeError\u001b[0m: 'set' object is not subscriptable"
164144
]
165145
}
@@ -171,22 +151,25 @@
171151
]
172152
},
173153
{
154+
"cell_type": "markdown",
155+
"metadata": {},
174156
"source": [
175157
"Однако, множества являются итерируемыми коллекциями. Но не стоит итерироваться по ним из-за отсутствия порядка. "
176-
],
177-
"cell_type": "markdown",
178-
"metadata": {}
158+
]
179159
},
180160
{
181161
"cell_type": "code",
182-
"execution_count": 3,
162+
"execution_count": 6,
183163
"metadata": {},
184164
"outputs": [
185165
{
186-
"output_type": "stream",
187166
"name": "stdout",
167+
"output_type": "stream",
188168
"text": [
189-
"0\n42\n3\nabc\n"
169+
"0\n",
170+
"42\n",
171+
"3\n",
172+
"abc\n"
190173
]
191174
}
192175
],
@@ -198,13 +181,28 @@
198181
]
199182
},
200183
{
184+
"cell_type": "markdown",
185+
"metadata": {},
201186
"source": [
202187
"Со множествами можно выполнять все операции, предусмотренные теорией множеств, а именно брать пересечение, объединение, разность и др. Эти операции представлены несколькими способами. Можно использовать операторы ```&```, ```|```, ```-``` и другие. В этом случае оба операнда должны иметь тип ```set```. Для всех этих операций есть представление в виде соответствующих методов. Отличие операторов от методов заключается в том, что методы могут принимать не только аргументы, которые должны иметь тип ```set```, но и любой итерируемый объект. Кроме этого методы могут принимать любое количество аргументов. Дополнительно у этих операторов есть аналоги в виде in-line операторов и соответствующие методы для изменения множеств \"на месте\"."
203-
],
204-
"cell_type": "markdown",
205-
"metadata": {}
188+
]
206189
},
207190
{
191+
"cell_type": "code",
192+
"execution_count": 7,
193+
"metadata": {},
194+
"outputs": [
195+
{
196+
"name": "stdout",
197+
"output_type": "stream",
198+
"text": [
199+
"Пересечение: a & b = {3, 4}\n",
200+
"Пересечение: a.intersection(b) = {3, 4}\n",
201+
"Разность: a - b = {1, 2}\n",
202+
"Пересечение (in-place): a = {3, 4}\n"
203+
]
204+
}
205+
],
208206
"source": [
209207
"a = {1, 2, 3, 4}\n",
210208
"b = {3, 4, 5, 6}\n",
@@ -217,50 +215,42 @@
217215
"\n",
218216
"a &= b\n",
219217
"print(f'Пересечение (in-place): {a = }')"
220-
],
221-
"cell_type": "code",
222-
"metadata": {},
223-
"execution_count": 6,
224-
"outputs": [
225-
{
226-
"output_type": "stream",
227-
"name": "stdout",
228-
"text": [
229-
"Пересечение: a & b = {3, 4}\nПересечение: a.intersection(b) = {3, 4}\nРазность: a - b = {1, 2}\nПересечение (in-place): a = {3, 4}\n"
230-
]
231-
}
232218
]
233219
},
234220
{
221+
"cell_type": "markdown",
222+
"metadata": {},
235223
"source": [
236224
"В таблице приведены операторы и методы для этих операций.\n",
237225
"\n",
238226
"| Операция | Оператор | Метод |\n",
239227
"|-------------------------|:--------:|-----------------------------------|\n",
240228
"| Пересечение | ```&``` | ```intersection``` |\n",
241229
"| | ```&=``` | ```intersection_update``` |\n",
242-
"| Объединение | ```|``` | ```union``` |\n",
243-
"| | ```|=``` | ```update``` |\n",
230+
"| Объединение | ```\\|``` | ```union``` |\n",
231+
"| | `\\|=` | ```update``` |\n",
244232
"| Разность | ```-``` | ```difference``` |\n",
245233
"| | ```-=``` | ```difference_update``` |\n",
246234
"| Симметрическая разность | ```^``` | ```symmetric_difference``` |\n",
247235
"| | ```^=``` | ```symmetric_difference_update``` |\n",
248236
"\n",
249237
"Кроме этих математический операций существует набор операций сравнения, включая оператор ```in``` для проверки элемента на вхождение в множество."
250-
],
251-
"cell_type": "markdown",
252-
"metadata": {}
238+
]
253239
},
254240
{
255241
"cell_type": "code",
256-
"execution_count": 11,
242+
"execution_count": 8,
257243
"metadata": {},
258244
"outputs": [
259245
{
260-
"output_type": "stream",
261246
"name": "stdout",
247+
"output_type": "stream",
262248
"text": [
263-
"Проверка наличия элемента: 1 in a = True\nb влючено в a (подмножество): b <= a = True\nb строго влючено в a (подмножество): b < a = True\nb включает a (надмножество): b >= a = False\nb строго включает a (надмножество): b > a = False\n"
249+
"Проверка наличия элемента: 1 in a = True\n",
250+
"b влючено в a (подмножество): b <= a = True\n",
251+
"b строго влючено в a (подмножество): b < a = True\n",
252+
"b включает a (надмножество): b >= a = False\n",
253+
"b строго включает a (надмножество): b > a = False\n"
264254
]
265255
}
266256
],
@@ -276,15 +266,15 @@
276266
]
277267
},
278268
{
269+
"cell_type": "markdown",
270+
"metadata": {},
279271
"source": [
280272
"Так как множества -- это изменяемый тип, то для них есть набор методов для их изменения."
281-
],
282-
"cell_type": "markdown",
283-
"metadata": {}
273+
]
284274
},
285275
{
286276
"cell_type": "code",
287-
"execution_count": 12,
277+
"execution_count": 9,
288278
"metadata": {},
289279
"outputs": [],
290280
"source": [
@@ -296,13 +286,37 @@
296286
]
297287
},
298288
{
289+
"cell_type": "markdown",
290+
"metadata": {},
299291
"source": [
300292
"# Полезные ссылки\n",
301293
"\n",
302294
"- [Python и теория множеств](https://habr.com/ru/post/516858/#otnosheniya-mezhdu-mnozhestvami)"
303-
],
304-
"cell_type": "markdown",
305-
"metadata": {}
295+
]
306296
}
307-
]
308-
}
297+
],
298+
"metadata": {
299+
"interpreter": {
300+
"hash": "178cad48488a45b94c2e1acb3bfd8ec03d0e926b0801a270a439a0363b59c19a"
301+
},
302+
"kernelspec": {
303+
"display_name": "Python 3.9.0 64-bit ('.venv': venv)",
304+
"name": "python3"
305+
},
306+
"language_info": {
307+
"codemirror_mode": {
308+
"name": "ipython",
309+
"version": 3
310+
},
311+
"file_extension": ".py",
312+
"mimetype": "text/x-python",
313+
"name": "python",
314+
"nbconvert_exporter": "python",
315+
"pygments_lexer": "ipython3",
316+
"version": "3.9.0"
317+
},
318+
"orig_nbformat": 2
319+
},
320+
"nbformat": 4,
321+
"nbformat_minor": 2
322+
}

0 commit comments

Comments
 (0)