Matematika standarde e modulit për funksionet matematikore në Python mund të përdoret për të llogaritur faktorët. SciPy gjithashtu ka funksione për të llogaritur numrin total të permutacioneve/kombinimeve.
Moduli itertools mund të përdoret gjithashtu për të gjeneruar permutacione dhe kombinime nga listat (vargjet), etj., dhe për t’i numëruar ato.
Më poshtë shpjegohet këtu, së bashku me kodin e mostrës.
- faktorial:
math.factorial()
- Llogaritni numrin total të permutacioneve
math.factorial()
scipy.special.perm()
- Gjeneroni dhe numëroni permutacione nga një listë:
itertools.permutations()
- Llogaritni numrin total të kombinimeve
math.factorial()
scipy.special.comb()
- Si të mos përdorni math.factorial()
- Gjeneroni dhe numëroni kombinime nga listat:
itertools.combinations()
- Llogaritni numrin total të kombinimeve të kopjuara
- Gjeneroni dhe numëroni kombinime të kopjuara nga një listë:
itertools.combinations_with_replacement()
Si shembull i përdorimit të permutacioneve, shpjegohet edhe më poshtë.
- Krijoni anagrame nga vargjet
Nëse dëshironi të gjeneroni një kombinim të elementeve të listimeve të shumta në vend të një listimi të vetëm, përdorni itertools.product() në modulin itertools.
- faktorial:math.factorial()
- Llogaritni numrin total të permutacioneve
- Gjeneroni dhe numëroni permutacione nga një listë:itertools.permutations()
- Llogaritni numrin total të kombinimeve
- Gjeneroni dhe numëroni kombinime nga listat:itertools.combinations()
- Llogaritni numrin total të kombinimeve të kopjuara
- Gjeneroni dhe numëroni kombinime të kopjuara nga një listë:itertools.combinations_with_replacement()
- Krijoni anagrame nga vargjet
faktorial:math.factorial()
Moduli i matematikës ofron një funksion faktorial() që kthen faktorialin.
import math
print(math.factorial(5))
# 120
print(math.factorial(0))
# 1
Vlerat jo të plota, negative do të rezultojnë në një ValueError.
# print(math.factorial(1.5))
# ValueError: factorial() only accepts integral values
# print(math.factorial(-1))
# ValueError: factorial() not defined for negative values
Llogaritni numrin total të permutacioneve
math.factorial()
Permutacionet janë numri i rasteve ku r zgjidhen nga n të ndryshme dhe vendosen në një rresht.
Numri i përgjithshëm i permutacioneve, p, merret nga ekuacioni i mëposhtëm duke përdorur faktorialët.
p = n! / (n - r)!
Mund të llogaritet si më poshtë duke përdorur funksionin math.factorial(), i cili kthen faktorialin. Operatori ⌘, i cili kryen ndarjen e numrave të plotë, përdoret për të kthyer një lloj të numrit të plotë.
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 ofron një funksion scipy.special.perm() që kthen numrin total të permutacioneve. Kërkohet një instalim i veçantë SciPy. Në dispozicion nga versioni 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
Argumenti i tretë vendoset si më sipër si parazgjedhje dhe kthen një numër me pikë lundruese. Vini re se nëse dëshironi ta merrni si numër të plotë, duhet ta vendosni si më poshtë.exact=True
Vini re se vetëm “import scipy” nuk do të ngarkojë modulin scipy.special.
Ekzekutoni perm() si “nga scipy.special import perm” si në shembullin e mësipërm, ose ekzekutoni scipy.special.perm() si “import scipy.special”.
Gjeneroni dhe numëroni permutacione nga një listë:itertools.permutations()
Jo vetëm numrat totalë, por edhe permutacionet mund të gjenerohen dhe numërohen nga listat (vargjet), etj.
Përdorni funksionin permutations() të modulit itertools.
Kalimi i një iterabil (liste ose lloj grupi) si argumenti i parë dhe numri i pjesëve që do të zgjidhen si argumenti i dytë kthen një përsëritës për atë ndryshim.
import itertools
l = ['a', 'b', 'c', 'd']
p = itertools.permutations(l, 2)
print(type(p))
# <class 'itertools.permutations'>
Për t’i numëruar të gjitha, mund të përdorni një lak 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')
Meqenëse është një përsëritës i fundëm, ai gjithashtu mund të konvertohet në një lloj liste me list().
Kur numri i elementeve në listë merret me len(), mund të konfirmohet se përputhet me numrin total të permutacioneve të llogaritura nga faktoriali.
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
Nëse hiqet argumenti i dytë, rikthimi për zgjedhjen e të gjithë elementëve kthehet.
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
Në itertools.permutations(), elementët trajtohen në bazë të pozicionit, jo të vlerës. Vlerat e dyfishta nuk merren parasysh.
l = ['a', 'a']
for v in itertools.permutations(l, 2):
print(v)
# ('a', 'a')
# ('a', 'a')
E njëjta gjë vlen edhe për funksionet e mëposhtme, të përshkruara më poshtë.
itertools.combinations()
itertools.combinations_with_replacement()
Llogaritni numrin total të kombinimeve
math.factorial()
Numri i kombinimeve është numri i r pjesëve për të zgjedhur nga n pjesë të ndryshme. Rendi nuk konsiderohet si në permutacione.
Numri i përgjithshëm i kombinimeve c fitohet nga ekuacioni i mëposhtëm.
c = n! / (r! * (n - r)!)
Mund të llogaritet si më poshtë duke përdorur funksionin math.factorial(), i cili kthen faktorialin. Operatori ⌘, i cili kryen ndarjen e numrave të plotë, përdoret për të kthyer një lloj të numrit të plotë.
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 ofron një funksion scipy.special.comb() që kthen numrin total të permutacioneve. Kërkohet një instalim i veçantë SciPy. Në dispozicion nga versioni 0.14.0. Vini re se scipy.misc.comb() nuk zbaton përsëritjen e argumentit të përshkruar më poshtë.
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
Ashtu si me scipy.special.perm(), argumenti i tretë vendoset si më sipër si parazgjedhje dhe kthen një numër me pikë lundruese. Vini re se nëse dëshironi ta merrni si numër të plotë, duhet ta vendosni si më poshtë.exact=True
Numri i përgjithshëm i kombinimeve të dyfishta mund të merret edhe me argumentin e katërt, përsëritjen. Kjo përshkruhet më poshtë.
Përsëri, vini re se vetëm “import scipy” nuk do të ngarkojë modulin scipy.special.
Ashtu si në shembullin e mësipërm, ekzekutoni comb() si “nga scipy.special import comb” ose ekzekutoni scipy.special.comb() si “import scipy.special”. E njëjta gjë vlen edhe për “scipy.misc”.
Si të mos përdorni math.factorial()
Një metodë tjetër që përdor vetëm bibliotekën standarde dhe është më e shpejtë se metoda që përdor math.factorial() është metoda e mëposhtme.
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
Gjeneroni dhe numëroni kombinime nga listat:itertools.combinations()
Është e mundur të gjenerohen dhe numërohen të gjitha kombinimet nga listat (vargjet) etj. si dhe numrat total.
Përdorni funksionin combinations() të modulit itertools.
Kalimi i një iterabilit (lista ose lloji i grupit) si argumenti i parë dhe numri i pjesëve që do të zgjidhen si argumenti i dytë kthen përsëritësin për atë kombinim.
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
Llogaritni numrin total të kombinimeve të kopjuara
Numri i kombinimeve të kopjuara është numri i rasteve në të cilat r zgjidhen nga n të ndryshme, duke lejuar dublikatat.
Numri i përgjithshëm i kombinimeve të dyfishta është i barabartë me numrin e kombinimeve për të zgjedhur (r) nga (n + r – 1) të ndryshme.
Prandaj, ne mund të përdorim funksionin e përcaktuar më sipër për të llogaritur numrin total të kombinimeve.
def combinations_with_replacement_count(n, r):
return combinations_count(n + r - 1, r)
print(combinations_with_replacement_count(4, 2))
# 10
Në “scipy.special.comb()” të përshkruar më sipër, numri i përgjithshëm i kombinimeve të kopjuara mund të merret duke vendosur argumentin e katërt “përsëritje=E vërtetë.
Vini re se argumenti “përsëritje” nuk zbatohet në “scipy.misc.comb()” në versionet para “SciPy0.14.0”.
from scipy.special import comb
print(comb(4, 2, exact=True, repetition=True))
# 10
Gjeneroni dhe numëroni kombinime të kopjuara nga një listë:itertools.combinations_with_replacement()
Është e mundur të gjenerohen dhe numërohen të gjitha kombinimet e kopjuara nga listat (vargjet), etj. si dhe numrat total.
Përdorni funksionin combinations_with_replacement() në modulin itertools.
Kalimi i një iterable (liste ose lloj grupi) si argumenti i parë dhe numri i pjesëve që do të zgjidhen si argumenti i dytë kthen një përsëritës për atë kombinim të mbivendosur.
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
Krijoni anagrame nga vargjet
Itertools.permutations() e bën të lehtë krijimin e permutacioneve të vargjeve (anagrame).
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')
Për të kombinuar një tufë me një karakter në një kohë në një varg dhe për ta bërë atë në një listë, bëni sa më poshtë
anagram_list = [''.join(v) for v in itertools.permutations(s)]
print(anagram_list)
# ['arc', 'acr', 'rac', 'rca', 'car', 'cra']
Përdoret metoda join(), e cila bashkon elementet e një liste ose tuple në një varg dhe shënimi i kuptimit të listës.