Ce face itertools.groupby()
groupby() parcurge colecția și, de fiecare dată când cheia se schimbă, începe un grup nou. Produce perechi (cheie, grup), unde grup este un iterator cu elementele consecutive cu acea cheie.
Grupează doar elementele vecine. Ca să obții un singur grup pentru fiecare cheie, sortează întâi colecția după aceeași cheie. Grupul trebuie folosit (de exemplu cu list()) înainte de a trece la următorul.
Parametri
| Parametru | Descriere |
|---|---|
iterabil |
Elementele. |
key |
Opțional. Funcția care dă cheia de grupare. Implicit, elementul însuși. |
Ce returnează
Un iterator de perechi (cheie, iterator_grup).
Exemple
Exemplul 1: Gruparea după o cheie, cu sortare
from itertools import groupby
vanzari = [("Iași", 120), ("Cluj", 80), ("Iași", 50), ("Arad", 30), ("Cluj", 20)]
vanzari.sort(key=lambda v: v[0])
for oras, grup in groupby(vanzari, key=lambda v: v[0]):
print(oras, sum(suma for _, suma in grup))
Rezultat
Arad 30
Cluj 100
Iași 170
Exemplul 2: Secvențe consecutive (comprimare)
from itertools import groupby
text = "aaabccdddd"
print([(litera, len(list(g))) for litera, g in groupby(text)])
print("".join(f"{k}{len(list(g))}" for k, g in groupby(text)))
Rezultat
[('a', 3), ('b', 1), ('c', 2), ('d', 4)]
a3b1c2d4
Greșeli frecvente
- Uiți să sortezi și aceeași cheie apare în mai multe grupuri separate.
- Salvezi grupurile într-o listă fără să le consumi (
list(groupby(...))) și apoi le găsești goale. Transformă fiecare grup în listă imediat.
Comenzi înrudite
collections.defaultdict: Un dicționar care creează automat o valoare implicită pentru cheile lipsă.sorted(): Returnează o listă nouă, sortată, cu elementele unei colecții.collections.Counter: Un dicționar specializat care numără de câte ori apare fiecare valoare.