itertools: kombinatoriikka
Tuottakaa permutaatioita, kombinaatioita ja karteesisia tuloja.
itertools: kombinatoriikka on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.
Kombinatoriikan yleiskatsaus
itertools tarjoaa neljä kombinatorista funktiota: product, permutations, combinations ja combinations_with_replacement.
import itertools
# All orderings of 2 items from ABC
print(list(itertools.permutations("ABC", 2)))
# [(A,B),(A,C),(B,A),(B,C),(C,A),(C,B)]product()
product(*iterables, repeat=1) laskee karteesisen tulon — se vastaa sisäkkäisiä for-silmukoita.
import itertools
print(list(itertools.product([1,2], ["a","b"])))
# [(1,"a"),(1,"b"),(2,"a"),(2,"b")]
# repeat=2 pairs each element with itself
print(list(itertools.product(range(2), repeat=2)))
# [(0,0),(0,1),(1,0),(1,1)]permutations()
permutations(it, r) tuottaa kaikki r-pituiset järjestetyt muodostelmat. Yhteensä: P(n,r) = n!/(n-r)!.
import itertools
result = list(itertools.permutations([1,2,3], 2))
print(result)
# [(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]
print(len(result)) # 6combinations()
combinations(it, r) tuottaa r-pituiset järjestämättömät valinnat ilman toistoa. Yhteensä: C(n,r) = n!/(r!(n-r)!).
import itertools
result = list(itertools.combinations([1,2,3,4], 2))
print(result)
# [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
print(len(result)) # 6combinations_with_replacement()
combinations_with_replacement(it, r) sallii saman alkion esiintymisen yhdistelmässä useammin kuin kerran.
import itertools
result = list(itertools.combinations_with_replacement("AB", 2))
print(result)
# [(A,A),(A,B),(B,B)]Laskeminen ilman materialisointia
Käyttäkää kaikkien alkioiden luomisen sijaan math.perm- tai math.comb-funktiota tai len()-oikopolkua (joka toimii äärellisillä tuloksilla), jos haluatte vain laskea alkiot.
import math
print(math.perm(10, 3)) # 720
print(math.comb(10, 3)) # 120Salasanojen ja avainten luominen
Kombinatoriikan iteraattorit soveltuvat ehdokasavainten tai testitapausten luomiseen ilman, että kaikkea ladataan muistiin.
import itertools, string
chars = string.ascii_lowercase
# All 2-char lowercase combos:
for combo in itertools.combinations(chars, 2):
pass # process without materialisingRuudukon koordinaatit product-funktiolla
Käyttäkää product(range(rows), range(cols))-funktiota 2D-ruudukon läpikäymiseen sisäkkäisten silmukoiden sijaan.
import itertools
for row, col in itertools.product(range(3), range(3)):
print(f"({row},{col})", end=" ")Kaikkien osajoukkojen testaaminen
Luokaa listan kaikki osajoukot käymällä combinations-funktion avulla läpi jokainen pituus välillä 0–n.
import itertools
items = [1, 2, 3]
all_subsets = []
for r in range(len(items)+1):
all_subsets.extend(itertools.combinations(items, r))
print(all_subsets)Kaksoiskappaleiden poistaminen combinations-funktiolla
Käyttäkää combinations-funktiota jokaisen alkioparin vertaamiseen täsmälleen kerran, jolloin päällekkäiset (a,b)- ja (b,a)-vertailut vältetään.
import itertools
words = ["apple","apricot","banana","blueberry"]
for a, b in itertools.combinations(words, 2):
if a[0] == b[0]:
print(f"Same letter: {a}, {b}")Suorituskykynäkökohdat
Kombinatoriset jonot kasvavat erittäin nopeasti. permutations(range(12)) tuottaa 479 miljoonaa tulosta. Käyttäkää aina generaattoreita ja materialisoikaa vain tarvitsemanne tulokset.
import itertools, math
n = 12
print(f"P(12,12) = {math.factorial(n):,}") # 479,001,600
# Never: list(itertools.permutations(range(12)))
# Instead: iterate lazily and break earlyPikatarkistus
Mikä itertools-funktio tuottaa kokoelmasta kaikki järjestämättömät parit ilman toistoa?
Kertaus
Käyttäkää product-funktiota karteesisiin tuloihin, permutations-funktiota järjestettyihin muodostelmiin, combinations-funktiota järjestämättömiin osajoukkoihin ja combinations_with_replacement-funktiota, kun alkiot voivat toistua. Käsitelkää kombinatoriset iteraattorit aina laiskasti.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 76
- Oppitunnit
- 320
Usein kysytyt kysymykset
Onko oppitunti ”itertools: kombinatoriikka” ilmainen?
Kyllä – oppitunnin ”itertools: kombinatoriikka” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”itertools: kombinatoriikka”?
Tuottakaa permutaatioita, kombinaatioita ja karteesisia tuloja. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”itertools: kombinatoriikka”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?
Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- itertools: äärettömät ja äärelliset iteraattorit
- itertools: kombinatoriikka
- functools: partial ja reduce
- functools: lru_cache ja cached_property