itertools

Narzędzia do pracy z iteratorami: łączenie, grupowanie, kombinacje i nieskończone ciągi.

Na tej stronie

Przykład

#
Python
from itertools import chain, combinations, count, islice

print(list(chain([1, 2], [3], [4, 5])))
print(list(combinations(["HTML", "CSS", "JS"], 2)))
print(list(islice(count(10, 5), 4)))
Wynikzapisany wynik, możesz go sprawdzić
[1, 2, 3, 4, 5]
[('HTML', 'CSS'), ('HTML', 'JS'), ('CSS', 'JS')]
[10, 15, 20, 25]

Definicja i zastosowanie

#

Moduł itertools zawiera funkcje, które tworzą i przekształcają iteratory. Zwracają elementy leniwie, po jednym, więc sprawdzają się także przy dużych, a nawet nieskończonych ciągach danych. Wynik przechodzisz pętlą for albo zamieniasz na listę przez list().

Do łączenia i przycinania służą chain() (kilka kolekcji jedna po drugiej), islice() (wycinek z iteratora) i batched() (podział na paczki po n elementów, od Pythona 3.12). Kombinatorykę obsługują product(), permutations() i combinations(), a accumulate() liczy sumy narastające.

Funkcje count(), cycle() i repeat() tworzą ciągi nieskończone, więc łącz je z czymś, co zakończy pętlę, np. z islice() albo zip(). groupby() grupuje tylko kolejne elementy o tym samym kluczu, dlatego dane trzeba najpierw posortować po tym kluczu.

Składnia

#
Składnia
from itertools import chain, combinations, groupby, islice

chain(*iterables)
combinations(iterable, r)
groupby(iterable, key=None)
islice(iterable, stop)

Więcej przykładów

#
groupby() na posortowanych danych
Python
from itertools import groupby

tasks = [("HTML", "1_1"), ("CSS", "2_1"), ("HTML", "1_2"), ("CSS", "2_2")]
tasks.sort(key=lambda task: task[0])

for course, group in groupby(tasks, key=lambda task: task[0]):
    print(course, [number for _, number in group])
Wynikzapisany wynik, możesz go sprawdzić
CSS ['2_1', '2_2']
HTML ['1_1', '1_2']
Paczki, sumy narastające i iloczyn kartezjański
Python
from itertools import accumulate, batched, product

print(list(batched(["1_1", "1_2", "1_3", "1_4", "1_5"], 2)))
print(list(accumulate([120, 80, 45, 200])))
print(list(product("AB", [1, 2])))
Wynikzapisany wynik, możesz go sprawdzić
[('1_1', '1_2'), ('1_3', '1_4'), ('1_5',)]
[120, 200, 245, 445]
[('A', 1), ('A', 2), ('B', 1), ('B', 2)]

Dobre praktyki

#
  • Iterator z itertools można przejść tylko raz. Jeśli potrzebujesz wyniku kilka razy, zapisz go jako listę.
  • Przed groupby() posortuj dane po tym samym kluczu. Inaczej ten sam klucz pojawi się w kilku osobnych grupach.
  • Nie wywołuj list() na count() ani cycle(). To ciągi nieskończone, które zawieszą program.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.