Python-da faktorialları, dəyişdirmələri və birləşmələri hesablayın və yaradın

Biznes

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()

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.

Copied title and URL