Python - Panoramica sulle liste

Python

Se state iniziando ad utilizzare Python, una cosa è certa (o quasi): Python non è stato il vostro primo linguaggio di programmazione. E' molto probabile che prima di iniziare a utilizzare Python vi sarete cimentati con Java o C++.
Come avevamo scritto nell'articolo introduttivo a Python, esistono grosse differenze tra questi linguaggi di programmazione, che però non risaltano ad una prima occhiata.

Tra le differenze più basilari c'è il modo in cui Python tratta le list, strutture dati sequenziali che sono traducibili con i classici array di Java o C++. Al momento in cui vi ritroverete ad usare le list vi verrà sicuramente spontaneo utilizzare istruzioni simili a Java e C++ per l'inizializzazione ed in generale per la loro manipolazione. Questo perchè vi siete gettatati su Python senza prima dare un'occhiata a tutorial e guide ufficiali.

In questo articolo vedremo sinteticamente alcuni modi per lavorare con le list che potrebbero facilitarvi la vita alle prime armi con Python. Vi ricordiamo che tutti gli argomenti trattati sono già disponibili sulle guide ufficiali di Python, che vi invitiamo a leggere per approfondimenti.



List Comprehensions

Avevamo già accennato nell'articolo introduttivo a questa particolare feature di Python.
Supponiamo che dobbiate inizializzare un array in modo che abbia al suo interno i quadrati di tutti gli interi dispari da 1 a 99.
Una situazione del genere, se provenite da Java o dal C++ usato soprattutto in ambito accademico, vi farà venire in mente un bel po' di righe di codice all'interno del body di un ciclo.
Anche in Python la situazione si risolve con un for ed un if, ma compattato tutto in un rigo:

array = [x**2 for x in range(100) if x%2==1]



Si possono mescolare insieme anche for annidati. Immaginiamo di avere una lista di liste come di seguito:

a = [[1,2,3],[2,4,6],[3,6,9]]

e che a partire da questa si voglia creare una nuova lista unica, con tutti gli elementi in a al quadrato. Per farlo, si può usare il seguente codice:

array = [x**2 for i in range(len(a)) for x in a[i]]



Allo stesso modo potete creare liste multiple (o anche liste di tuple), per esempio la lista delle tuple < x,x^2,x^3 > per tutti gli x interi fino a 20:

triplets = [[x,x**2,x**3] for x in range(20)]




Filter, Map e Reduce

Dalla mia esperienza personale, le funzioni built-in di Python di cui andremo a parlare in questo paragrafo si avvicinano molto alla visione che i programmatori Matlab hanno quando devono applicare una funzione custom a vettori e matrici.


filter: letteralemente funzioni per "filtrare" un oggetto iterabile. Con filter potete applicare una condizione ad una lista e farvi restituire tutti gli elementi della lista che rispondono a tale condizione. Se per esempio volessimo estrarre tutti i numeri pari da una lista di interi casuali:

import random
integers = random.sample(range(100),10)
def only_even(x): return x%2==0
a = filter(only_even,integers)

Dovete perciò definire una funzione che restituisca un valore booleano. Tale valore sarà poi applicato all'iterabile passato a filter.


map: utilizzando map potete applicare una funzione definita a tutti gli elementi di una lista. Per esempio, se a partire da un range di valori per l'asse X volete trovare i valori dell'asse Y per plottare una funzione, potete farlo come segue:

import numpy as np
xs = np.arange(-10,10,0.1)
def y_squared(x): return x**2
ys = map(y_squared,xs)



reduce: grazie a reduce è possibile applicare una funzione binaria ad una lista. La funzione è applicata ai primi due elementi della lista. Il risultato è passato in ingresso alla funzione insieme al terzo elemento. Il risultato di questo insieme al quarto, e così via per tutti gli elementi della funzione. Per calcolare banalmente la somma dei valori di una lista, potreste perciò fare:

import random
array = random.sample(range(100),10)
def my_sum(x,y): return x+y
sum = reduce(my_sum, array)




Altri modi per creare liste di tuple

Oltre al caso della list comprehension vista nel primo paragrafo, esistono altri modi per creare una lista di tuple. Primo fra tutti, zip: con questa funzione built-in è possibile unire più liste in un'unica lista di tuple.

a1 = [0,1,2,3,4]
a2 = [0,2,4,6,8]
a3 = [1,3,5,7,9]
a = zip(a1,a2,a3)

Come risultato del codice precedente, in a[0] avremo la tupla (0,0,1).


La funzione zip può essere utilizzata, in coppia con iter, anche per creare una lista di tuple a partire da una lista già esistente:

a = [0,1,2,3,4,5,6,7,8,9]
array = zip((*[iter(a)] * 2))

Nel codice precedente è stata create una lista di tuple bidimensionali a partire dalla lista a.


La funzione zip può essere banalmente utilizzata anche per ciclare simultaneamente su più liste dello stessa lunghezza:

a1 = [0,1,2,3,4]
a2 = ['a','b','c','d','e']
for x,y in zip(a1,a2):
	print str(x) + ' ' + str(y)







Vi consiglio di consultare anche queste due interessanti pagine per scoprire altri trucchetti da utilizzare per Python:
- What are some cool Python tricks?
- Hidden features of Python

Come sempre, vi invitiamo a commentare per qualsiasi dubbio, domanda o precisazione a quanto indicato. Ogni vostro contributo è ben accetto!

Alessio Antonielli

Ingegnere informatico, appassionato di cinema, musica, videogiochi e serie tv. Insomma, le solite cose che vi aspettereste da un ex studente di Ingegneria Informatica, giusto per rafforzare lo stereotipo…

Python - Panoramica sulle liste ultima modifica: 2016-03-08T12:30:53+01:00 da Alessio Antonielli


Advertisment ad adsense adlogger