0Pricing
Python Academy · Lekcja

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))  # 6

combinations()

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))  # 6

combinations_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))   # 120

Generowanie 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 materialising

Współ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 early

Szybkie 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

  1. itertools: iteratory nieskończone i skończone
  2. itertools: kombinatoryka
  3. functools: partial i reduce
  4. functools: lru_cache i cached_property
← Powrót do Python Academy