-
Notifications
You must be signed in to change notification settings - Fork 0
/
combin.py
263 lines (210 loc) · 13.1 KB
/
combin.py
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
"""Комбинаторика."""
# <p><d>РАЗНОЕ ВАЖНОЕ</d></p>
# <p>Имена класса всегда пишутся зеленым цветом, функции/методы всегда пишутся желтым цветом. list - имя класса. len - метод/функция.</p>
# <p>Название класса без скобок - это ссылка на место класса в памяти компьютера</p>
# <p>Имя класса плюс круглые скобки () - это создание обьекта / экземпляр класса list() - это обьект. </p>
# <p>ВНИМАНИЕ при создании объекта во всех классах вызывается _init_</p>
# <p>В скобках пишутся аргументы. Аргументы - это </p>
# <p>Имплементация - реализация в коде или на ЯП (языке программирования). Это строка docstring.</p>
# <p>Знак вопроса ? - вызывает сигнатуру обьекта.</p>
#
# <p>**Itertools** — это Python-модуль, который предоставляет набор функций для работы с итерируемыми объектами.</p>
#
# <p>**Итерируемый объект** — это любой объект, предоставляющий возможность пройти в цикле по своим элементам,
# например список, кортеж и словарь.
# Itertools позволяет выполнять стандартные операции с итерируемыми объектами, такие как фильтрация,
# группировка и объединение.
# https://docs-python.ru/tutorial/osnovnye-vstroennye-tipy-python/tip-dannyh-iterator-iterator/ </p>
#
# <p>Итерируемый объект(iterable) это последовательность или коллекция.</p>
# <p>Итератор - это объект, который позволяет перебирать элементы коллекции по одному,
# например, списки, кортежи, строки и генераторы.</p>
# <p>Итератор - объект у которого есть два метода next iter.</p>
# <p>**Модуль Itertools** предоставляет несколько функций, позволяющих манипулировать итерируемыми объектами.
# Рассмотрим подробнее наиболее полезные функции itertools.</p>
# <p> Внедряем формулы Теории вероятности в Питон</p>
#
# ![формулы ТВ.jpg](<attachment:формулы ТВ.jpg>)
# +
# import itertools # noqa # pylint: disable=unused-import
# -
from itertools import combinations, permutations
# <p><b>permutation</b> - это класс, встроенная инструкция в модуле
# itertools для создания обьектов, эта функция возвращает все возможные
# перестановки итерируемого объекта с уникальным расположением элементов в итераторе</p>
# <p> Синтаксис: Permutations(iterator, r)</p>
# <p> Если не указывать функции значение r, то Permutations принимает ‘r’
# в качестве длины итератора по умолчанию, и возвращает все возможные перестановки длиной ‘r’ каждая.
# В этом случае она содержит формулу количества перестановок без повторений.</p>
# <p><b>Pn = n!</b> Сколькими способами можно переставить n объектов?</p>
# +
# Дано: яблоко / груша / банан
# Вопрос: сколькими способами их можно переставить?
# Формула количества перестановок Pn=n!
# Сколькими способами можно переставить n объектов.
perm = permutations(["яблоко", "груша", "банан"])
len(list(perm))
# +
# Сколькими способами можно переставить буквы в слове?
wrd_1 = "Май"
wrd_2 = "Июнь"
wrd_3 = "Осень"
# Формула количества перестановок Pn=n!
# Сколькими способами можно переставить n объектов.
perm_1 = permutations(wrd_1)
perm_2 = permutations(wrd_2)
perm_3 = permutations(wrd_3)
print(len(list(perm_1)), len(list(perm_2)), len(list(perm_3)))
# -
# <p>Если указать функции значение r, то Permutations принимает ее как необходимую длину перестановки.
# В этом случае она содержит формулу количества размещений.
# Сколькими спопосбами можно выбрать m объектов из n объектов и в каждой выборке переставить их местами.</p>
# <p>Синтаксис : itertools.<d>combination(iterable, r)</d></p>
# <p>Где r - длина выходных кортежей.</p>
# <p>Эта функция возвращает подпоследовательности (кортежи) длины r из входной итерации.</p>
# <p>Она принимает список объектов и длину выходных кортежей (r) в качестве входных данных.</p>
# <p>Это фактически формула количества сочетаний: сколькими способами можно выбрать m объектов из n объектов.</p>
# +
# Сколько трехзначных чисел можно составить из цифр 1,2,3,4,5?
lst_1 = [1, 2, 3, 4, 5]
# Сколько трехзначных чисел. состоящих из различных цифр,
# можно составить из цифр 1,2,3,4,5?
lst_2 = [1, 2, 3, 4, 5]
# Формула количества размещений.
# Сколькими способами можно выбрать m объектов из n объектов
# и в каждой выборке переставить их местами.
task_1 = permutations(lst_1, r=3)
task_2 = combinations(lst_2, r=3)
print(len(list(task_1)), len(list(task_2)))
# +
# Сколькими способами можно выбрать
# а) один фрукт,
# b) два фрукта,
# c) три фрукта,
# d) хотя бы один фрукт.
frt: list[str] = ["яблоко", "груша", "банан"]
task_a = combinations(frt, 1)
task_b = combinations(frt, 2)
task_c = combinations(frt, 3)
print(len(list(task_a)), len(list(task_b)), len(list(task_c)))
# +
# В ящике находится 15 деталей. Сколькими способами
# можно взять 4 детали.
dtl = list(range(1, 16))
choice_2 = combinations(dtl, 4)
len(list(choice_2))
# +
# Сколькими способами из колоды в 36 карт
# можно выбрать 3 карты?
pack = list(range(1, 37))
choice = combinations(pack, 3)
len(list(choice))
# +
# В шахматном турнире участвует человек и каждый
# с ним играет по одной партии.
# Сколько всего партий сыгранов турнире?
# +
# Записать все возможные сочетания и все возможные размещения
# из 4 элементов множества D = {a, b, c, d} по три элемента.
quantity_d = ["a", "b", "c", "d"]
perm = permutations(quantity_d, 3)
comb = combinations(quantity_d, 3)
print(len(list(perm)), len(list(comb)))
# +
# Боря, Дима и Володя сели играть в "очко".
# Сколькими способами им можно сдать по одной карте
# если колода содержит 36 карт?
# +
# Боря, Дима и Володя сели играть в "очко".
# Сколькими способами им можно сдать по три карты
# если колода содержит 36 карт?
game = list(range(1, 37))
possib = permutations(game, r=3)
len(list(possib))
# -
# В студенческой группе 23 человека. Сколькими способами
# можно выбрать старосту и его заместителя?
group = list(range(1, 24))
choice_1 = permutations(group, 2)
len(list(choice_1))
# <p>Итератор - это объект, который может перебирать элементы с помощью метода _next_().</p>
# <p>Метод это функция внутри класса.</p>
# <p>Метод плюс круглые скобки это вызов метода.</p>
# <p>Все что вызывает через точку с круглыми скобочками- это метод объекта.</p>
# <p>Имя класса плюс круглые скобки это создание объекта.</p>
# <p>Если заходишь в метод и видишь название класс - это метод.</p>
#
#
# +
# argument 'iterable' - iterable - итерируемая последовательность,
# iterable (optional) - an object that could be
# a sequence (string (https://www.programiz.com/python-programming/string),
# tuples (https://www.programiz.com/python-programming/tuple))
# or collection (set (https://www.programiz.com/python-programming/set),
# dictionary (https://www.programiz.com/python-programming/dictionary))
# or any iterator (https://www.programiz.com/python-programming/iterator)
# object
dir(type(permutations({1, 2})))
# -
# <p>Класс list() предназначен для преобразования итератора в список.</p>
# <p> Итератор - это объект, который позволяет перебирать элементы коллекции по одному, например, списки, кортежи, строки и генераторы.</p>
#
# <p>https://www.w3schools.com/python/python_iterators.asp</p>
#
# The list() constructor takes a single argument:
#
# iterable (optional) - an object that could be
# a sequence (string (https://www.programiz.com/python-programming/string),
# tuples (https://www.programiz.com/python-programming/tuple))
# or collection (set (https://www.programiz.com/python-programming/set),
# dictionary (https://www.programiz.com/python-programming/dictionary))
# or any iterator (https://www.programiz.com/python-programming/iterator) object
perm = permutations(["яблоко", "груша", "банан"])
list(perm)
# <p> В Python ВСЕ является объектами!!!</p>
# <p><b> ПРАВИЛА РАБОТЫ С ОБЪЕКТАМИ</b></p>
# <p>1. type</p>
# <p>2. dir - method of object/click on class name</p>
# <p>3. call method with ?</p>
# <p>4. method ()</p>
perm = permutations(["яблоко", "груша", "банан"])
type(perm) # type возвращает тип данных объекта в даном случае
# мы столкнулись с исключением правил
hex(id(int)) # id - это hex - это
# +
# perm?
# -
dir(int)
perm = permutations(["яблоко", "груша", "банан"])
dir(perm) # если dir дает метод _next_ значит нам возвращается итератор
# +
perm = permutations(["яблоко", "груша", "банан"])
# next?
# -
perm = permutations(["яблоко", "груша", "банан"])
print(next(perm))
print(next(perm))
print(next(perm))
print(next(perm))
print(next(perm))
print(next(perm))
# +
# perm.__next__?
# -
# тип обьекта итератор - это специальный обьект в питоне который позволяет перебирать элементы коллекции
# есть метод итер (инициализирует интератор) и метод некст (перемещает к следующему элементу)
# методы обьекта вызываются через точку
# метод - это обычная функция
# атрибуты - это обычная переменная
count_perm = len(list(perm))
count_perm
# len([*perm])
list(perm)
# +
#
# Init signature: permutations(iterable, r=None)
# permutations?
# -
# <p><b>combinations</b> - это класс, встроенная инструкция в модуле itertools для создания обьектов,
# эта функция возвращает все возможные комбинации элементов в итерируемом объекте, не повторяя в итераторе
# ни одной из комбинаций. Если указан опциональный аргумент r, будут возвращены только комбинации длины r. она содержит в себе</p>