Python-da riyazi funksiyalar üçün standart modul riyaziyyat faktorialları hesablamaq üçün istifadə edilə bilər. SciPy həmçinin permutasiyaların/kombinasiyaların ümumi sayını hesablamaq funksiyalarına malikdir.
itertools modulu həmçinin siyahılardan (massivlərdən) permutasiyalar və kombinasiyalar yaratmaq və onları sadalamaq üçün istifadə edilə bilər.
Aşağıdakılar nümunə kodla birlikdə burada izah olunur.
- faktorial:
math.factorial()
- Permütasyonların ümumi sayını hesablayın
math.factorial()
scipy.special.perm()
- Siyahıdan permutasiyalar yaradın və sadalayın:
itertools.permutations()
- Kombinasiyaların ümumi sayını hesablayın
math.factorial()
scipy.special.comb()
- math.factorial() istifadə etməmək üçün necə
- Siyahılardan birləşmələr yaradın və sadalayın:
itertools.combinations()
- Dublikat birləşmələrin ümumi sayını hesablayın
- Siyahıdan dublikat birləşmələri yaradın və sadalayın:
itertools.combinations_with_replacement()
Permutasiyalardan istifadə nümunəsi olaraq aşağıdakılar da izah olunur.
- Sətirlərdən anaqramlar yaradın
Bir siyahı əvəzinə bir neçə siyahının elementlərinin birləşməsini yaratmaq istəyirsinizsə, itertools modulunda itertools.product() istifadə edin.
- faktorial:math.factorial()
- Permütasyonların ümumi sayını hesablayın
- Siyahıdan permutasiyalar yaradın və sadalayın:itertools.permutations()
- Kombinasiyaların ümumi sayını hesablayın
- Siyahılardan birləşmələr yaradın və sadalayın:itertools.combinations()
- Dublikat birləşmələrin ümumi sayını hesablayın
- Siyahıdan dublikat birləşmələri yaradın və sadalayın:itertools.combinations_with_replacement()
- Sətirlərdən anaqramlar yaradın
faktorial:math.factorial()
Riyaziyyat modulu faktorialı qaytaran faktorial() funksiyasını təmin edir.
import math
print(math.factorial(5))
# 120
print(math.factorial(0))
# 1
Tam olmayan, mənfi dəyərlər ValueError ilə nəticələnəcək.
# print(math.factorial(1.5))
# ValueError: factorial() only accepts integral values
# print(math.factorial(-1))
# ValueError: factorial() not defined for negative values
Permütasyonların ümumi sayını hesablayın
math.factorial()
Permutasiyalar r-nin n müxtəlifdən seçilib cərgədə yerləşdirildiyi halların sayıdır.
Dəyişmələrin ümumi sayı, p, faktoriallardan istifadə edərək aşağıdakı tənlik ilə alınır.
p = n! / (n - r)!
Faktorialı qaytaran math.factorial() funksiyasından istifadə etməklə onu aşağıdakı kimi hesablamaq olar. Tam ədədin bölünməsini həyata keçirən ⌘ operatoru tam ədəd növünü qaytarmaq üçün istifadə olunur.
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 ümumi dəyişmələrin sayını qaytaran scipy.special.perm() funksiyasını təmin edir. Ayrı bir SciPy quraşdırılması tələb olunur. 0.14.0 versiyasından mövcuddur.
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
Üçüncü arqument defolt olaraq yuxarıdakı kimi təyin edilir və üzən nöqtə nömrəsini qaytarır. Qeyd edək ki, əgər onu tam ədəd kimi almaq istəyirsinizsə, onu aşağıdakı kimi təyin etməlisiniz.exact=True
Qeyd edək ki, yalnız “import scipy” scipy.special modulunu yükləməyəcək.
Perm() funksiyasını yuxarıdakı misalda olduğu kimi “from scipy.special import perm” kimi icra edin və ya scipy.special.perm() funksiyasını “import scipy.special” kimi icra edin.
Siyahıdan permutasiyalar yaradın və sadalayın:itertools.permutations()
Siyahılardan (massivlərdən) yalnız ümumi nömrələr deyil, həm də dəyişdirmələr yaradıla və sadalana bilər.
itertools modulunun permutations() funksiyasından istifadə edin.
Birinci arqument kimi təkrarlana bilən (siyahı və ya dəst növü) və ikinci arqument kimi seçiləcək parçaların sayı həmin permutasiya üçün iteratoru qaytarır.
import itertools
l = ['a', 'b', 'c', 'd']
p = itertools.permutations(l, 2)
print(type(p))
# <class 'itertools.permutations'>
Hamısını sadalamaq üçün for loopundan istifadə edə bilərsiniz.
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')
Sonlu iterator olduğundan, list() ilə də siyahı tipinə çevrilə bilər.
Siyahıdakı elementlərin sayı len() ilə əldə edildikdə, onun faktorialdan hesablanmış dəyişmələrin ümumi sayına uyğun gəldiyi təsdiqlənə bilər.
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
İkinci arqument buraxılıbsa, bütün elementləri seçmək üçün permutasiya qaytarılır.
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()-da elementlər dəyərə deyil, mövqeyə görə müalicə olunur. Dublikat dəyərlər nəzərə alınmır.
l = ['a', 'a']
for v in itertools.permutations(l, 2):
print(v)
# ('a', 'a')
# ('a', 'a')
Eyni şey aşağıda təsvir olunan aşağıdakı funksiyalara aiddir.
itertools.combinations()
itertools.combinations_with_replacement()
Kombinasiyaların ümumi sayını hesablayın
math.factorial()
Kombinasiyaların sayı n müxtəlif parça arasından seçiləcək r ədədin sayıdır. Sifariş dəyişdirmələrdə olduğu kimi nəzərə alınmır.
C birləşmələrinin ümumi sayı aşağıdakı tənliklə əldə edilir.
c = n! / (r! * (n - r)!)
Faktorialı qaytaran math.factorial() funksiyasından istifadə etməklə onu aşağıdakı kimi hesablamaq olar. Tam ədədin bölünməsini həyata keçirən ⌘ operatoru tam ədəd növünü qaytarmaq üçün istifadə olunur.
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 ümumi dəyişmələrin sayını qaytaran scipy.special.comb() funksiyasını təmin edir. Ayrı bir SciPy quraşdırılması tələb olunur. 0.14.0 versiyasından mövcuddur. Qeyd edək ki, scipy.misc.comb() aşağıda təsvir edilən arqumentlərin təkrarını həyata keçirmir.
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() ilə olduğu kimi, üçüncü arqument defolt olaraq yuxarıdakı kimi təyin edilir və üzən nöqtəli nömrə qaytarır. Qeyd edək ki, əgər onu tam ədəd kimi almaq istəyirsinizsə, onu aşağıdakı kimi təyin etməlisiniz.exact=True
Dublikat birləşmələrin ümumi sayını dördüncü arqument, təkrar ilə də əldə etmək olar. Bu aşağıda təsvir edilmişdir.
Yenə də qeyd edək ki, yalnız “import scipy” scipy.special modulunu yükləməyəcəkdir.
Yuxarıdakı misalda olduğu kimi, comb() funksiyasını “scipy.special import comb’dan” və ya scipy.special.comb() funksiyasını “import scipy.special” kimi icra edin. Eyni şey “scipy.misc” üçün də keçərlidir.
math.factorial() istifadə etməmək üçün necə
Yalnız standart kitabxanadan istifadə edən və math.factorial() metodundan daha sürətli olan başqa bir üsul aşağıdakı metoddur.
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
Siyahılardan birləşmələr yaradın və sadalayın:itertools.combinations()
Siyahılardan (massivlərdən) və s., həmçinin ümumi nömrələrdən bütün kombinasiyaları yaratmaq və sadalamaq mümkündür.
itertools modulunun kombinasiyaları() funksiyasından istifadə edin.
Birinci arqument kimi təkrarlana bilən (siyahı və ya dəst növü) və ikinci arqument kimi seçiləcək parçaların sayı həmin birləşmə üçün iteratoru qaytarır.
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
Dublikat birləşmələrin ümumi sayını hesablayın
Dublikat kombinasiyaların sayı r-nin dublikatlara imkan verən n müxtəlifdən seçildiyi halların sayıdır.
Dublikat birləşmələrin ümumi sayı (n + r – 1) müxtəlif olanlardan (r) seçmək üçün birləşmələrin sayına bərabərdir.
Buna görə də, birləşmələrin ümumi sayını hesablamaq üçün yuxarıda müəyyən edilmiş funksiyadan istifadə edə bilərik.
def combinations_with_replacement_count(n, r):
return combinations_count(n + r - 1, r)
print(combinations_with_replacement_count(4, 2))
# 10
Yuxarıda təsvir edilən “scipy.special.comb()”-da dublikat birləşmələrin ümumi sayını dördüncü arqument “repetition=True” təyin etməklə əldə etmək olar.
Qeyd edək ki, “təkrar” arqumenti “SciPy0.14.0”-dan əvvəlki versiyalarda “scipy.misc.comb()”-da tətbiq edilmir.
from scipy.special import comb
print(comb(4, 2, exact=True, repetition=True))
# 10
Siyahıdan dublikat birləşmələri yaradın və sadalayın:itertools.combinations_with_replacement()
Siyahılardan (massivlərdən) və s., həmçinin ümumi nömrələrdən bütün dublikat kombinasiyaları yaratmaq və sadalamaq mümkündür.
itertools modulunda birləşmələr_with_replacement() funksiyasından istifadə edin.
Birinci arqument kimi təkrarlana bilən (siyahı və ya dəst növü) və ikinci arqument kimi seçiləcək parçaların sayının ötürülməsi həmin üst-üstə düşən birləşmə üçün iteratoru qaytarır.
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
Sətirlərdən anaqramlar yaradın
Itertools.permutations() simli permutasiyaları (anaqramlar) yaratmağı asanlaşdırır.
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')
Hər dəfə bir simvoldan ibarət dəstini sətirdə birləşdirmək və onu siyahıya çevirmək üçün aşağıdakıları edin
anagram_list = [''.join(v) for v in itertools.permutations(s)]
print(anagram_list)
# ['arc', 'acr', 'rac', 'rca', 'car', 'cra']
Siyahı və ya dəftərin elementlərini sətirdə birləşdirən join() metodu və siyahının başa düşülməsi qeydindən istifadə edilir.