itertools: kombinatoryka
Proszę generować permutacje, kombinacje i iloczyny kartezjańskie.
itertools: kombinatoryka to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Przegląd kombinatoryki
itertools udostępnia cztery funkcje kombinatoryczne: product, permutations, combinations oraz 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) oblicza iloczyn kartezjański — jest równoważne zagnieżdżonym pętlom for.
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) zwraca wszystkie uporządkowane układy o długości r. Łącznie: 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) zwraca wszystkie r-elementowe wybory bez uwzględniania kolejności i bez powtórzeń. Łącznie: 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) pozwala, aby element wystąpił więcej niż raz w jednej kombinacji.
import itertools
result = list(itertools.combinations_with_replacement("AB", 2))
print(result)
# [(A,A),(A,B),(B,B)]Zliczanie bez materializowania
Zamiast generować wszystkie elementy tylko po to, aby je policzyć, należy użyć math.perm, math.comb lub skrótu w postaci len() (działa dla skończonych wyników).
import math
print(math.perm(10, 3)) # 720
print(math.comb(10, 3)) # 120Generowanie haseł/kluczy
Iteratory kombinatoryczne są przydatne do generowania kluczy kandydujących lub przypadków testowych bez ładowania wszystkiego do pamięci.
import itertools, string
chars = string.ascii_lowercase
# All 2-char lowercase combos:
for combo in itertools.combinations(chars, 2):
pass # process without materialisingWspółrzędne siatki za pomocą product
Należy użyć product(range(rows), range(cols)), aby iterować po siatce 2D bez zagnieżdżonych pętli.
import itertools
for row, col in itertools.product(range(3), range(3)):
print(f"({row},{col})", end=" ")Testowanie wszystkich podzbiorów
Wszystkie podzbiory listy można wygenerować, iterując po combinations dla każdej długości od 0 do 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)Eliminowanie duplikatów za pomocą combinations
Należy użyć combinations, aby porównać każdą parę elementów dokładnie raz i uniknąć powtarzających się porównań (a,b) oraz (b,a).
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}")Kwestie wydajnościowe
Ciągi kombinatoryczne rosną bardzo szybko. permutations(range(12)) generuje 479 milionów wyników. Należy zawsze używać generatorów i materializować tylko potrzebne dane.
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 earlySzybkie sprawdzenie
Która funkcja itertools generuje wszystkie nieuporządkowane pary bez powtórzeń z kolekcji?
Podsumowanie
Należy używać product do iloczynów kartezjańskich, permutations do uporządkowanych układów, combinations do nieuporządkowanych podzbiorów, a combinations_with_replacement, gdy elementy mogą się powtarzać. Iteratory kombinatoryczne należy zawsze przetwarzać leniwie.
Często zadawane pytania
Czy lekcja „itertools: kombinatoryka” jest bezpłatna?
Tak — pełny tekst „itertools: kombinatoryka” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „itertools: kombinatoryka”?
Proszę generować permutacje, kombinacje i iloczyny kartezjańskie. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „itertools: kombinatoryka”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- itertools: iteratory nieskończone i skończone
- itertools: kombinatoryka
- functools: partial i reduce
- functools: lru_cache i cached_property