itertools.chain() în Python

Modulul itertools Python 3.0+

Parcurge mai multe colecții una după alta, ca și cum ar fi una singură.

Sintaxă
itertools.chain(*iterabile)
itertools.chain.from_iterable(iterabil_de_iterabile)

Ce face itertools.chain()

chain(a, b, c) produce toate elementele lui a, apoi ale lui b, apoi ale lui c, fără să construiască o listă nouă. Funcționează cu orice iterabile: liste, tupluri, texte, generatoare.

chain.from_iterable(liste) primește o singură colecție de colecții și le „aplatizează” pe un nivel; este util când nu știi dinainte câte liste ai.

Parametri

Parametru Descriere
*iterabile Colecțiile parcurse pe rând.

Ce returnează

Un iterator.

Exemple

Exemplul 1: Mai multe liste într-una

from itertools import chain
fructe = ["mere", "pere"]
legume = ("roșii",)
print(list(chain(fructe, legume, "ab")))

clase = [["Ana", "Dan"], ["Ioana"], ["Mihai", "Elena"]]
print(list(chain.from_iterable(clase)))

Rezultat

['mere', 'pere', 'roșii', 'a', 'b']
['Ana', 'Dan', 'Ioana', 'Mihai', 'Elena']

Greșeli frecvente

  • Aplatizezi o listă de liste cu sum(liste, []). Este foarte lent pe liste mari; folosește chain.from_iterable().

Comenzi înrudite

  • list.extend(): Adaugă la sfârșitul listei toate elementele unei alte colecții.
  • itertools.islice(): Ia o „felie” dintr-un iterator sau generator, ca [start:stop:pas] la liste.
  • yield (generatoare): Transformă o funcție într-un generator, care produce valorile una câte una, la cerere.