Python Itertools-Funzioni che creano Iteratori per un efficiente looping.

Python Itertools:
Questo modulo standardizza un nucleo di strumenti veloci ed efficienti in termini di memoria che sono utili da soli o in combinazione. Insieme, formano un "iterator algebra”
che rende possibile costruire strumenti specializzati in modo succinto ed efficiente in puro Python.
Il modulo itertools di Python è disponibile nella Python Standard Library.
Tipi di iteratori forniti da questo modulo:
- Iteratori infiniti
- Iteratori che terminano sulla sequenza di input più breve
- Iteratori combinatori
Il tipo di ritorno sarà un oggetto Iterator.Possiamo iterare attraverso l’iteratore
- usando la funzione next()
- usando il ciclo for
- convertendo in un oggetto lista usando list()
Iteratori infiniti:
count(),cycle(),repeat()
- count():
Fa un iteratore che restituisce valori uniformemente distanziati a partire dal numero specificato nell’argomento start.Per default start è 0 e step è 1.Questa funzione restituisce un iteratore infinito.
itertools.count(start=0,step=1)
E’ anche usato come argomento nelle funzioni map() e zip().
zip()
-la funzione zip() è una funzione integrata in Python che permette di combinare elementi corrispondenti da sequenze multiple e restituire un oggetto zip che è un iteratore di tuple. itertools.count()
può essere usato come sequenza nella funzione zip().
map()
-Python map() è usata per applicare la funzione su tutti gli elementi nell’iterabile specificato e ritorna un oggetto map che è un iteratore. Possiamo usare itertools.count() come argomento nella funzione map() .
2. cycle():
Fa un iteratore restituendo elementi dall’iterabile e salvando una copia di ognuno.Quando l’iterabile è esaurito, restituisce l’elemento dalla copia salvata.Ripete indefinitamente.
itertools.cycle(iterable)
3.repeat():
Fa un iteratore che restituisce l’oggetto più e più volte.
Esegue indefinitamente a meno che non sia menzionato l’argomento delle volte.
Usato come argomento nelle funzioni map() e zip().
itertools.repeat(object,times)
E’ usato come argomento nella funzione map().
E’ usato come argomento nella funzione zip().
Iteratori che terminano sulla sequenza di input più breve:
- accumulate():
Fa un iteratore che restituisce la somma accumulata o i risultati accumulati di altre funzioni binarie che sono menzionate nel parametro func.
Di solito il numero di elementi nell’iterabile di uscita corrisponde al numero di elementi nell’iterabile di ingresso; se è menzionato il parametro iniziale, viene accumulato, quindi l’iterabile di uscita contiene un elemento in più dell’iterabile di ingresso.functools.reduce()
restituisce solo il valore finale accumulato per una funzione simile.
il parametro iniziale è introdotto inPython version 3.8
itertools.accumulate(iterable,func,*,initial=None)
2. chain():
Fa un iteratore che restituisce elementi dal primo iterabile fino al suo esaurimento, poi procede all’iterabile successivo. Tratterà sequenze consecutive come una singola sequenza.itertools.chain(*iterables)
3. chain.from_iterable():
Questa funzione prende un iterabile come argomento di input e restituisce un iterabile appiattito contenente tutti gli elementi nell’iterabile di input. Tutti gli elementi nell’iterabile di input devono essere iterabili, altrimenti solleverà TypeError.
chain.from_iterable(iterable)
4. compress():
Fa un iteratore che filtra gli elementi dai dati restituendo solo quelli che hanno un elemento corrispondente in selettori che valuta a True.Si ferma quando gli iterabili dei dati o dei selettori sono esauriti.
itertools.compress(data,selectors)
5.dropwhile():
Crea un iteratore che lascia cadere elementi dall’iterabile finché il predicato è Vero, poi restituisce ogni elemento. L’iteratore non produce alcun output finché il predicato non diventa Falso.
itertools.dropwhile(predicate,iterable)
6.takewhile():
Crea un iteratore che restituisce elementi dall’iterabile finché il predicato è Vero.
itertools.takewhile(predicate,iterable)
7. filterfalse():
Fai un iteratore che filtra gli elementi dall’iterabile restituendo solo quelli per cui il predicato è Falso.Se il predicato è None, restituisce gli elementi che sono False.filter()
metodo restituisce un iteratore che contiene elementi di un iterabile per i quali la funzione restituisce True.
itertools.filterfalse(predicate,iterables)
8.zip_longest():
Fa un iteratore che aggrega elementi da ogni iterabile. Se le iterabili sono di lunghezza non uniforme, il valore mancante viene riempito con il valore di riempimento. L’iterazione continua fino all’esaurimento dell’iterabile più lungo.
In zip(), l’iterazione continua fino all’esaurimento dell’iterabile più breve.
itertools.zip_longest(*iterables,fillvalue=None)
9. starmap():
Crea un iteratore che calcola la funzione usando gli argomenti ottenuti dall’iterabile. Usato al posto di map() quando i parametri degli argomenti sono già raggruppati in tuple da un unico iterabile (i dati sono stati “pre-zippati”).
itertools.starmap(function,iterable)
10. islice():
Fa un iteratore che ritorna elementi selezionati dall’iterabile. Se start è None
, allora l’iterazione inizia da zero. Se step è None
, allora il passo predefinito è uno.Se stop è None
, allora l’iterazione continua fino a quando l’iteratore non è esaurito, se mai; altrimenti, si ferma alla posizione specificata. islice()
non supporta valori negativi per start, stop e step.
itertools.islice(iterable,stop)
itertools.islice(iterable, start, stop)
11.tee():
Ritorna n iteratori indipendenti da un singolo iterabile.
itertools.tee(iterable,n=2)
12. groupby():
Crea un iteratore che restituisce chiavi e gruppi consecutivi dall’iterabile.
key è una funzione che calcola il valore della chiave per ogni elemento.Se la chiave non è specificata o None, key ha come valore predefinito una funzione di identità e restituisce l’elemento invariato.
itertools.groupby(iterable,key=None)
Iteratori combinatori:
- product():
Prodotto cartesiano di iterabili in ingresso.
Definizione del prodotto cartesiano: Il prodotto dell’insieme X e dell’insieme Y è l’insieme che contiene tutte le coppie ordinate ( x, y ) per le quali x appartiene a X e y appartiene a Y.
Per calcolare il prodotto di un iterabile con se stesso, specificate il numero di ripetizioni con l’argomento opzionale repeat keyword. Per esempio, product(A, repeat=4) significa lo stesso di product(A, A, A, A).
itertools.product(*iterables,repeat)
2. permutazioni():
Ritorna le successive r
permutazioni di lunghezza degli elementi nell’iterabile. Se r non è specificato o è None, allora r è predefinito alla lunghezza dell’iterabile e tutte le possibili permutazioni di lunghezza intera sono generate. Le tuple di permutazione sono emesse in ordine lessicografico secondo l’ordine dell’iterabile di input. Quindi, se l’iterabile di input è ordinato, le tuple di combinazione saranno prodotte in ordine ordinato.
Gli elementi sono trattati come unici in base alla loro posizione, non al loro valore. Quindi se gli elementi di input sono unici, non ci saranno valori ripetuti in ogni permutazione.
itertools.permutations(iterable,r=None)
Nota:Nelle permutazioni, l’ordine degli elementi conta.
3. combinations():
Ritorna r
sottosequenze di lunghezza di elementi dall’iterabile di input.
Le tuple di combinazione sono emesse in ordine lessicografico secondo l’ordine dell’iterabile di input. Quindi, se l’iterabile di input è ordinato, le tuple di combinazione saranno prodotte in ordine ordinato.
Ordinamento lessicografico significa modo di ordinare le parole in ordine alfabetico delle loro lettere componenti.
Gli elementi sono trattati come unici in base alla loro posizione, non al loro valore. Quindi, se gli elementi di input sono unici, non ci saranno valori ripetuti in ogni combinazione.
itertools.combinations(iterable, r)
4. combinations_with_replacement():
Ritorna r
sottosequenze di lunghezza di elementi dall’iterabile di input permettendo ai singoli elementi di essere ripetuti più di una volta.
itertools.combinations_with_replacement(iterable, r)
Note:
1. Used as an argument in map() and zip():
count(),repeat()
repeat()- supply stream of constant values to map() or zip() function.
count()-it will supply different values to map() or zip() function.2.Difference between cycle() and repeat():
cycle()-iterates over the same object again and again
repeat()-returns the same object again and again.3.Difference between reduce() and itertools.accumulate():
reduce():
* It will return only the final accumulated value.
* First argument should be function and second argument should be iterable.
accumulate()
* It will return the running accumulated value.The elements in the output iterable will be equal to elements in the input iterable,if initial value is not mentioned.
* First argument should be iterable and second argument should be function.4.Difference between filter() and itertools.compress():
* filter()function-filters the given iterable with the help of function that test each element in the iterable is True or not.
* compress():filters the given iterable based on the corresponding element in the selector. Iterable containing True /False is given as selector.5.Difference between filter() and itertools.filterfalse():
*filter():Construct an iterator from the elements of iterable for which function returns True.
*filterfalse():Construct an iterator from the elements of iterable for which function returns False.6.Difference between zip() and itertools.zip_longest():
*zip():Iteration continues until shortest iterable is exhausted.
*zip_longest():Iteration continues until longest iterable is exhausted.7.Difference between list slicing and itertools.islice():
*List slicing creates new list
*islice()-Returns an iterator.We can loop through the iterator,in the way we want.
8.Difference between itertools.permutations() and itertools.combinations():
* itertools.permutations():Order of the elements does matters.
*itertools.combinations():Order of the elements doesn’t matters.
Both combinations and permutations doesn’t repeat values.
9.Difference between itertools.combinations() and itertools.combinations_with_replacement
* combinations():Order of element doesn’t matters and doesn’t repeat values.
* combinations_with_replacement():Order of element doesn’t matters and it repeats values.10.Difference between itertools.takewhile() and itertools.dropwhile():
* takewhile():Make an iterator that returns element from the iterable as long as the predicate is True.
* dropwhile():Make an iterator that drops element from the iterable as long as the predicate is True afterwards returns every element.