Una guida agli Itertools di Python

accumulate()

itertools.accumulate(iterable)

Questa funzione crea un iteratore che restituisce i risultati di una funzione. Le funzioni possono essere passate molto simili alle variabili. La funzione accumulate() prende una funzione come argomento. Prende anche un iterabile. Restituisce i risultati accumulati. I risultati sono essi stessi contenuti in un iterabile. Tutto questo può sembrare molto confuso. Vi assicuro che quando giocherete con il codice avrà senso.

Codice

data = result = itertools.accumulate(data, operator.mul)
for each in result:
print(each)

Output

1
2
6
24
120

L’operator.mul prende due numeri e li moltiplica.

operator.mul(1, 2)
2
operator.mul(2, 3)
6
operator.mul(6, 4)
24
operator.mul(24, 5)
120

In questo prossimo esempio useremo la funzione max.

Codice

data = result = itertools.accumulate(data, max)
for each in result:
print(each)

Output

5
5
6
6
6
9
9

La funzione max ritorna l’elemento più grande.

5
max(5, 2)
5
max(5, 6)
6
max(6, 4)
6
max(6, 5)
6
max(6, 9)
9
max(9, 1)
9

Il passaggio di una funzione è opzionale.

Codice

data = result = itertools.accumulate(data)
for each in result:
print(each)

Output

5
7
13
17
22
31
32

Se non viene designata alcuna funzione gli elementi saranno sommati.

5
5 + 2 = 7
7 + 6 = 13
13 + 4 = 17
17 + 5 = 22
22 + 9 = 31
31 + 1 = 32

combinations()

itertools.combinations(iterable, r)

Questa funzione prende un iterabile e un intero. Questo creerà tutte le combinazioni uniche che hanno r membri.

Codice

shapes = result = itertools.combinations(shapes, 2)for each in result:
print(each)

In questo codice facciamo tutte le combo con 2 membri.

Output

('circle', 'triangle')
('circle', 'square')
('triangle', 'square')

Codice

shapes = result = itertools.combinations(shapes, 3)for each in result:
print(each)

In questo codice facciamo tutte le combo con 3 membri. È un po’ meno eccitante.

Output

('circle', 'triangle', 'square')

combinations_with_replacement()

itertools.combinations_with_replacement(iterable, r)

Questa è proprio come la funzione combinations(), ma questa permette ai singoli elementi di essere ripetuti più di una volta.

Codice

shapes = result = itertools.combinations_with_replacement(shapes, 2)
for each in result:
print(each)

Output

('circle', 'circle')
('circle', 'triangle')
('circle', 'square')
('triangle', 'triangle')
('triangle', 'square')
('square', 'square')

count()

itertools.count(start=0, step=1)

Fa un iteratore che restituisce valori uniformemente spaziati a partire dal numero iniziale.

Codice

for i in itertools.count(10,3):
print(i)
if i > 20:
break

Nel codice precedente, iteriamo o facciamo un loop su una funzione. Diciamo alla funzione di iniziare da 10 e fare il passo 3.

Output

10
13
16
19
22

Questa prima iterazione ha il valore 10. Nel passo successivo facciamo un passo o aggiungiamo 3. Questo ha il valore di 13. Facciamo la stessa cosa per la prossima iterazione e otteniamo un valore di 16. Questo continuerebbe all’infinito ma, abbiamo aggiunto una pausa.

cycle()

itertools.cycle(iterable)

Questa funzione fa un ciclo attraverso un iteratore all’infinito.

Codice

colors = for color in itertools.cycle(colors):
print(color)

Nel codice precedente, creiamo una lista. Poi facciamo un ciclo o un loop attraverso questa lista all’infinito. Normalmente, un for ciclo passa attraverso un iterabile fino alla fine. Se una lista ha 3 elementi, il ciclo itererà 3 volte. Ma non se usiamo la funzione cycle(). Con questa funzione, quando raggiungiamo la fine dell’iterabile ricominciamo dall’inizio.

Output

red
orange
yellow
green
blue
indigo
violet
red
orange
yellow
green
...

Ho troncato l’output infinito sopra con delle ellissi.

catena()

itertools.chain(*iterables)

Questa funzione prende una serie di iterabili e li restituisce come un iterabile lungo.

Codice

colors = 
shapes = result = itertools.chain(colors, shapes)
for each in result:
print(each)

Output

red
orange
yellow
green
blue
circle
triangle
square
pentagon

compress()

itertools.compress(data, selectors)

Questa funzione filtra un iterabile con un altro.

Codice

shapes = 
selections = result = itertools.compress(shapes, selections)
for each in result:
print(each)

Output

circle
square

dropwhile()

itertools.dropwhile(predicate, iterable)

Crea un iteratore che lascia cadere elementi dall’iterabile finché il predicato è vero; dopo, restituisce ogni elemento.

Codice

data = result = itertools.dropwhile(lambda x: x<5, data)
for each in result:
print(each)

Output

5
6
7
8
9
10
1

Ok. Questo può confondere. Il codice dice di far cadere ogni elemento mentre l’elemento è inferiore a 5. Dopo che incontra un elemento che non è inferiore a 5, restituisce il resto. Ecco perché viene restituito l’ultimo.

Step Through It

1 < 5: True, drop
2 < 5: True, drop
3 < 5: True, drop
4 < 5: True, drop
5 < 5: False, return surviving items

filterfalse()

itertools.filterfalse(predicate, iterable)

Questa funzione crea un iteratore che filtra gli elementi dall’iterabile restituendo solo quelli per cui il predicato è False.

Codice

data = 
result = itertools.filterfalse(lambda x: x<5, data)
for each in result:
print(each)

Output

5
6
7
8
9
10

Step Through It

1 < 5: True, drop
2 < 5: True, drop
3 < 5: True, drop
4 < 5: True, drop
5 < 5: False, keep
6 < 5: False, keep
7 < 5: False, keep
8 < 5: False, keep
9 < 5: False, keep
10 < 5: False, keep

groupby()

itertools.groupby(iterable, key=None)

In poche parole, questa funzione raggruppa le cose. Ok. Questo è complicato. E l’esempio è un po’ lungo.

Codice

robots = for key, group in itertools.groupby(bots, key=lambda x: x):
print(key)
print(list(group))

Output

autobot

decepticon

islice()

itertools.islice(iterable, start, stop)

Questa funzione è molto simile a slices. Questa funzione vi permette di tagliare un pezzo di un iterabile.

Codice

colors = 
few_colors = itertools.islice(colors, 2)
for each in few_colors:
print(each)

Output

red
orange

permutazioni()

itertools.permutations(iterable, r=None)

Codice

alpha_data = result = itertools.permutations(alpha_data)
for each in result:
print(each)

Output

('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

prodotto()

Questa funzione crea i prodotti cartesiani da una serie di iterabili.

Codice

num_data = 
alpha_data = result = itertools.product(num_data, alpha_data)
for each in result:
print(each)

Output

(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')

Immaginate una tabella come questa:

 a b c
1 a1 b1 c1
2 a2 b2 c3
3 a3 b3 b3

repeat()

itertools.repeat(object)

Questa funzione ripeterà un oggetto più e più volte. A meno che non ci sia un argomento times.

Codice

for i in itertools.repeat("spam"):
print(i)

Nel codice sopra, creiamo un iterable che ripete semplicemente spam più e più volte. Lo farà all’infinito. Ecco come si crea un spam infinito.

Output

spam
spam
spam
spam
spam
spam
...

Ho troncato l’output infinito sopra con delle ellissi.

Codice

for i in itertools.repeat("spam", 3):
print(i)

Se usiamo l’argomento times, possiamo limitare il numero di volte che si ripeterà.

Output

spam
spam
spam

In questo esempio spam ripete solo tre volte.

starmap()

itertools.starmap(function, iterable)

Questa funzione crea un iteratore che calcola la funzione utilizzando gli argomenti ottenuti dall’iterabile. Diamo un’occhiata.

Codice

data = 
result = itertools.starmap(operator.mul, data)
for each in result:
print(each)

Output

12
32
21

Step Through

operator.mul(2, 6)
12
operator.mul(8, 4)
32
operator.mul(7, 3)
21

takewhile()

itertools.takwwhile(predicate, iterable)

Questo è un po’ il contrario di dropwhile(). Questa funzione crea un iteratore e restituisce elementi dall’iterabile se il predicato è vero.

Codice

data = result = itertools.takewhile(lambda x: x<5, data)
for each in result:
print(each)

Output

1
2
3
4

Step Through It

1 < 5: True, keep going
2 < 5: True, keep going
3 < 5: True, keep going
4 < 5: True, keep going
5 < 5: False, stop and drop

tee()

itertools.tee(iterable, n=2)

Ritorna n iteratori indipendenti da un singolo iterabile.

Codice

colors = 
alpha_colors, beta_colors = itertools.tee(colors)for each in alpha_colors:
print(each)print('..')for each in beta_colors:
print(each)

Il valore predefinito è 2, ma potete crearne quanti ne volete.

Output

red
orange
yellow
green
blue
..
red
orange
yellow
green
blue

zip_longest()

itertools.zip_longest(*iterables, fillvalue=None)

Questa funzione crea un iteratore che aggrega elementi da ciascuna delle iterabili. Se le iterabili sono di lunghezza disuguale, i valori mancanti sono riempiti con fillvalue. L’iterazione continua fino ad esaurire l’iterabile più lungo.

Codice

colors = 
data = for each in itertools.zip_longest(colors, data, fillvalue=None):
print(each)

Output

('red', 1)
('orange', 2)
('yellow', 3)
('green', 4)
('blue', 5)
(None, 6)
(None, 7)
(None, 8)
(None, 9)
(None, 10)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *