itertools
Narzędzia do pracy z iteratorami: łączenie, grupowanie, kombinacje i nieskończone ciągi.
Przykład
#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)))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
#from itertools import chain, combinations, groupby, islice
chain(*iterables)
combinations(iterable, r)
groupby(iterable, key=None)
islice(iterable, stop)Więcej przykładów
#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])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])))Dobre praktyki
#- Iterator z
itertoolsmoż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()nacount()anicycle(). To ciągi nieskończone, które zawieszą program.
Powiązane hasła
#- zip()Łączy kilka kolekcji w pary (lub krotki) odpowiadających sobie elementów.
- enumerate()Dodaje licznik do elementów podczas przechodzenia pętlą.
- yieldTworzy generator: funkcję zwracającą kolejne wartości na żądanie.
- range()Tworzy ciąg liczb całkowitych, najczęściej do pętli for.
- map()Wywołuje funkcję dla każdego elementu i zwraca iterator wyników.
- functoolsNarzędzia do pracy z funkcjami: zapamiętywanie wyników (lru_cache), częściowe wywołania (partial) i zwijanie kolekcji (reduce).
Widzisz błąd albo brakuje przykładu? Napisz do nas.