Python тіліндегі математикалық функцияларға арналған стандартты математика модулін факториалды есептеу үшін пайдалануға болады. SciPy-де ауыстыру/комбинациялардың жалпы санын есептеу функциялары бар.
itertools модулін тізімдерден (массивтерден) ауыстырулар мен комбинацияларды жасау және оларды санау үшін де пайдалануға болады.
Төменде үлгі кодымен бірге мұнда түсіндіріледі.
- факторлық:
math.factorial()
- Орын ауыстырулардың жалпы санын есептеңіз
math.factorial()
scipy.special.perm()
- Тізімнен ауыстыруларды жасаңыз және санаңыз:
itertools.permutations()
- Комбинациялардың жалпы санын есептеңіз
math.factorial()
scipy.special.comb()
- math.factorial() қолданбасы
- Тізімдерден комбинацияларды жасаңыз және санаңыз:
itertools.combinations()
- Қайталанатын комбинациялардың жалпы санын есептеңіз
- Тізімнен қайталанатын комбинацияларды жасаңыз және санаңыз:
itertools.combinations_with_replacement()
Ауыстыруларды пайдаланудың мысалы ретінде төмендегілер де түсіндіріледі.
- Жолдардан анаграммалар құру
Бір тізімнің орнына бірнеше тізім элементтерінің тіркесімін жасағыңыз келсе, itertools модулінде itertools.product() пайдаланыңыз.
- факторлық:math.factorial()
- Орын ауыстырулардың жалпы санын есептеңіз
- Тізімнен ауыстыруларды жасаңыз және санаңыз:itertools.permutations()
- Комбинациялардың жалпы санын есептеңіз
- Тізімдерден комбинацияларды жасаңыз және санаңыз:itertools.combinations()
- Қайталанатын комбинациялардың жалпы санын есептеңіз
- Тізімнен қайталанатын комбинацияларды жасаңыз және санаңыз:itertools.combinations_with_replacement()
- Жолдардан анаграммалар құру
факторлық:math.factorial()
Математикалық модуль факториалды қайтаратын факториалды() функциясын қамтамасыз етеді.
import math
print(math.factorial(5))
# 120
print(math.factorial(0))
# 1
Бүтін емес, теріс мәндер ValueError нәтижесіне әкеледі.
# print(math.factorial(1.5))
# ValueError: factorial() only accepts integral values
# print(math.factorial(-1))
# ValueError: factorial() not defined for negative values
Орын ауыстырулардың жалпы санын есептеңіз
math.factorial()
Орын ауыстырулар – r әр түрлі n-ден таңдалып, қатарға орналастырылатын жағдайлар саны.
Орын ауыстырулардың жалпы саны, p, факториалдар көмегімен келесі теңдеу арқылы алынады.
p = n! / (n - r)!
Оны факториалды қайтаратын math.factorial() функциясы арқылы келесідей есептеуге болады. Бүтін сандарды бөлуді орындайтын ⌘ операторы бүтін сан түрін қайтару үшін пайдаланылады.
def permutations_count(n, r):
return math.factorial(n) // math.factorial(n - r)
print(permutations_count(4, 2))
# 12
print(permutations_count(4, 4))
# 24
scipy.special.perm()
SciPy ауыстырулардың жалпы санын қайтаратын scipy.special.perm() функциясын қамтамасыз етеді. Бөлек SciPy орнату қажет. 0.14.0 нұсқасынан бастап қол жетімді.
from scipy.special import perm
print(perm(4, 2))
# 12.0
print(perm(4, 2, exact=True))
# 12
print(perm(4, 4, exact=True))
# 24
exact=False
Үшінші аргумент әдепкі бойынша жоғарыдағыдай орнатылады және өзгермелі нүкте нөмірін қайтарады. Егер сіз оны бүтін сан ретінде алғыңыз келсе, оны келесідей орнатуыңыз керек екенін ескеріңіз.exact=True
Тек «импорт scipy» scipy.special модулін жүктемейтінін ескеріңіз.
Жоғарыдағы мысалдағыдай perm() функциясын «scipy.special import perm ішінен» ретінде орындаңыз немесе scipy.special.perm() функциясын «import scipy.special» ретінде орындаңыз.
Тізімнен ауыстыруларды жасаңыз және санаңыз:itertools.permutations()
Тізімдерден (массивтерден) тек жалпы сандарды ғана емес, ауыстыруларды да жасауға және санауға болады.
itertools модулінің пермутациялар() функциясын пайдаланыңыз.
Бірінші аргумент ретінде қайталанатын (тізім немесе жиын түрі) және екінші аргумент ретінде таңдалатын бөліктер саны осы ауыстыру үшін итераторды қайтарады.
import itertools
l = ['a', 'b', 'c', 'd']
p = itertools.permutations(l, 2)
print(type(p))
# <class 'itertools.permutations'>
Олардың барлығын санау үшін for циклін пайдалануға болады.
for v in itertools.permutations(l, 2):
print(v)
# ('a', 'b')
# ('a', 'c')
# ('a', 'd')
# ('b', 'a')
# ('b', 'c')
# ('b', 'd')
# ('c', 'a')
# ('c', 'b')
# ('c', 'd')
# ('d', 'a')
# ('d', 'b')
# ('d', 'c')
Бұл ақырлы иератор болғандықтан, оны list() арқылы тізім түріне түрлендіруге де болады.
Тізімдегі элементтер саны len() арқылы алынғанда, оның факториалдан есептелген ауыстырулардың жалпы санына сәйкес келетінін растауға болады.
p_list = list(itertools.permutations(l, 2))
print(p_list)
# [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
print(len(p_list))
# 12
Екінші аргумент алынып тасталса, барлық элементтерді таңдауға арналған ауыстыру қайтарылады.
for v in itertools.permutations(l):
print(v)
# ('a', 'b', 'c', 'd')
# ('a', 'b', 'd', 'c')
# ('a', 'c', 'b', 'd')
# ('a', 'c', 'd', 'b')
# ('a', 'd', 'b', 'c')
# ('a', 'd', 'c', 'b')
# ('b', 'a', 'c', 'd')
# ('b', 'a', 'd', 'c')
# ('b', 'c', 'a', 'd')
# ('b', 'c', 'd', 'a')
# ('b', 'd', 'a', 'c')
# ('b', 'd', 'c', 'a')
# ('c', 'a', 'b', 'd')
# ('c', 'a', 'd', 'b')
# ('c', 'b', 'a', 'd')
# ('c', 'b', 'd', 'a')
# ('c', 'd', 'a', 'b')
# ('c', 'd', 'b', 'a')
# ('d', 'a', 'b', 'c')
# ('d', 'a', 'c', 'b')
# ('d', 'b', 'a', 'c')
# ('d', 'b', 'c', 'a')
# ('d', 'c', 'a', 'b')
# ('d', 'c', 'b', 'a')
print(len(list(itertools.permutations(l))))
# 24
itertools.permutations() ішінде элементтер мәнге емес, позицияға қарай өңделеді. Қайталанатын мәндер есепке алынбайды.
l = ['a', 'a']
for v in itertools.permutations(l, 2):
print(v)
# ('a', 'a')
# ('a', 'a')
Бұл төменде сипатталған келесі функцияларға да қатысты.
itertools.combinations()
itertools.combinations_with_replacement()
Комбинациялардың жалпы санын есептеңіз
math.factorial()
Комбинациялар саны – n түрлі бөліктен таңдауға болатын r дана саны. Тапсырыс ауыстырулардағы ретінде қарастырылмайды.
Комбинациялардың жалпы саны c келесі теңдеу арқылы алынады.
c = n! / (r! * (n - r)!)
Оны факториалды қайтаратын math.factorial() функциясы арқылы келесідей есептеуге болады. Бүтін сандарды бөлуді орындайтын ⌘ операторы бүтін сан түрін қайтару үшін пайдаланылады.
def combinations_count(n, r):
return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
print(combinations_count(4, 2))
# 6
scipy.special.comb()
SciPy ауыстырулардың жалпы санын қайтаратын scipy.special.comb() функциясын қамтамасыз етеді. Бөлек SciPy орнату қажет. 0.14.0 нұсқасынан бастап қол жетімді. scipy.misc.comb() төменде сипатталған дәлелді қайталауды орындамайтынын ескеріңіз.
from scipy.special import comb
print(comb(4, 2))
# 6.0
print(comb(4, 2, exact=True))
# 6
print(comb(4, 0, exact=True))
# 1
exact=False
scipy.special.perm() сияқты үшінші аргумент әдепкі бойынша жоғарыдағыдай орнатылады және өзгермелі нүкте санын қайтарады. Егер сіз оны бүтін сан ретінде алғыңыз келсе, оны келесідей орнатуыңыз керек екенін ескеріңіз.exact=True
Қайталанатын комбинациялардың жалпы санын төртінші дәлелмен, қайталаумен де алуға болады. Бұл төменде сипатталған.
Қайтадан, scipy.special модулін тек «импорт scipy» жүктемейтінін ескеріңіз.
Жоғарыдағы мысалдағыдай comb() функциясын «scipy.special import comb» ретінде орындаңыз немесе scipy.special.comb() функциясын «import scipy.special» ретінде орындаңыз. Бұл «scipy.misc» үшін де қолданылады.
math.factorial() қолданбасы
Тек стандартты кітапхананы пайдаланатын және math.factorial() қолданатын әдіске қарағанда жылдамырақ басқа әдіс келесі әдіс болып табылады.
from operator import mul
from functools import reduce
def combinations_count(n, r):
r = min(r, n - r)
numer = reduce(mul, range(n, n - r, -1), 1)
denom = reduce(mul, range(1, r + 1), 1)
return numer // denom
print(combinations_count(4, 2))
# 6
print(combinations_count(4, 0))
# 1
Тізімдерден комбинацияларды жасаңыз және санаңыз:itertools.combinations()
Тізімдерден (массивтерден) және т.б., сондай-ақ жалпы сандардан барлық комбинацияларды құруға және санауға болады.
itertools модулінің комбинациялары() функциясын пайдаланыңыз.
Бірінші аргумент ретінде қайталанатын (тізім немесе жиын түрі) және екінші аргумент ретінде таңдалатын бөліктер саны осы комбинация үшін иераторды қайтарады.
l = ['a', 'b', 'c', 'd']
c = itertools.combinations(l, 2)
print(type(c))
# <class 'itertools.combinations'>
for v in itertools.combinations(l, 2):
print(v)
# ('a', 'b')
# ('a', 'c')
# ('a', 'd')
# ('b', 'c')
# ('b', 'd')
# ('c', 'd')
c_list = list(itertools.combinations(l, 2))
print(c_list)
# [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
print(len(c_list))
# 6
Қайталанатын комбинациялардың жалпы санын есептеңіз
Қайталанатын комбинациялар саны – көшірмелерді жасауға мүмкіндік беретін n әртүрліден r таңдалған жағдайлардың саны.
Қайталанатын комбинациялардың жалпы саны әртүрлі (n + r – 1) ішінен (r) таңдалатын комбинациялар санына тең.
Сондықтан комбинациялардың жалпы санын есептеу үшін жоғарыда анықталған функцияны пайдалана аламыз.
def combinations_with_replacement_count(n, r):
return combinations_count(n + r - 1, r)
print(combinations_with_replacement_count(4, 2))
# 10
Жоғарыда сипатталған «scipy.special.comb()» ішінде қайталанатын комбинациялардың жалпы санын «қайталау=Шын» төртінші аргументін орнату арқылы алуға болады.
«Қайталау» аргументі «SciPy0.14.0» нұсқасына дейінгі нұсқаларда «scipy.misc.comb()» ішінде іске асырылмайтынын ескеріңіз.
from scipy.special import comb
print(comb(4, 2, exact=True, repetition=True))
# 10
Тізімнен қайталанатын комбинацияларды жасаңыз және санаңыз:itertools.combinations_with_replacement()
Барлық қайталанатын комбинацияларды тізімдерден (массивтерден) және т.б., сондай-ақ жалпы сандардан генерациялауға және санауға болады.
itertools модулінде combines_with_replacement() функциясын пайдаланыңыз.
Бірінші аргумент ретінде қайталанатын (тізім немесе жиын түрі) және екінші аргумент ретінде таңдалатын бөліктер санын беру сол қабаттасатын комбинация үшін итераторды қайтарады.
h = itertools.combinations_with_replacement(l, 2)
print(type(h))
# <class 'itertools.combinations_with_replacement'>
for v in itertools.combinations_with_replacement(l, 2):
print(v)
# ('a', 'a')
# ('a', 'b')
# ('a', 'c')
# ('a', 'd')
# ('b', 'b')
# ('b', 'c')
# ('b', 'd')
# ('c', 'c')
# ('c', 'd')
# ('d', 'd')
h_list = list(itertools.combinations_with_replacement(l, 2))
print(h_list)
# [('a', 'a'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'b'), ('b', 'c'), ('b', 'd'), ('c', 'c'), ('c', 'd'), ('d', 'd')]
print(len(h_list))
# 10
Жолдардан анаграммалар құру
Itertools.permutations() жол ауыстыруларды (анаграммалар) жасауды жеңілдетеді.
s = 'arc'
for v in itertools.permutations(s):
print(v)
# ('a', 'r', 'c')
# ('a', 'c', 'r')
# ('r', 'a', 'c')
# ('r', 'c', 'a')
# ('c', 'a', 'r')
# ('c', 'r', 'a')
Бір уақытта бір таңбадан тұратын кортежді жолға біріктіріп, оны тізімге айналдыру үшін келесі әрекеттерді орындаңыз
anagram_list = [''.join(v) for v in itertools.permutations(s)]
print(anagram_list)
# ['arc', 'acr', 'rac', 'rca', 'car', 'cra']
Тізім немесе кортеж элементтерін жолға біріктіретін join() әдісі және тізімді түсіну белгісі пайдаланылады.