itertools.groupby() în Python

Modulul itertools Python 3.0+

Grupează elementele consecutive care au aceeași cheie.

Sintaxă
itertools.groupby(iterabil, key=None)

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.