Collezioni

Nel capitolo precedente abbiamo visto alcuni tipi di base come i numeri, le stringhe e i booleani. In questo capitolo vedremo alcuni tipi di collezioni di dati: liste, tuple e dizionari.
Liste
La lista è un tipo di collezione ordinata. Sarebbe equivalente a quello che in altri linguaggi è noto come array o vettori.
Le liste possono contenere qualsiasi tipo di dati: numeri, stringhe, booleani, … e anche liste.
Creare una lista è così semplice come indicare tra parentesi quadre e separati da virgole, i valori che vogliamo includere nella lista:
			l = [22, True, "una lista", [1, 2]]
Possiamo accedere a ciascuna delle voci della lista scrivendo il nel nome della lista e indicando l’indice tra parentesi quadre. Si noti tuttavia che l’indice del primo elemento della lista è 0 e non 1:
			l = [11, False]
			mia_var = l[0] # mia_var vale 11
Se vogliamo accedere a un elemento di una lista inclusa in un’altra lista dobbiamo usare questo operatore due volte, prima per indicare la posizione della lista esterna che si desidera accedere, e la seconda per selezionare l’elemento della lista interna.
			l = ["una lista", [1, 2]]
			mia_var = l[1][0] # mia_var vale 1
Possiamo utilizzare anche questo operatore per modificare una voce della lista se collocati nella parte sinistra di un’assegnazione:
			l = [22, True]
			l[0] = 99 # Con questo l sarà [99, True]
L’utilizzo delle parentesi quadre per accedere e modificare le voci di una lista è comune in molte linguaggi, ma Python ci offre diverse sorprese molto piacevoli.
Una curiosità sull’operatore [] di Python è che possiamo utilizzare anche i numeri negativi. Se utilizziamo un numero negativo come indice, questo significa che l’indice inizia il conteggio dalla fine, verso sinistra, cioè, con [-1] si accede all’ultimo elemento della lista con [-2] il penultimo con [-3], il terz’ultimo, e così via.
Un’altra cosa insolita è quello che in Python è noto come affettatura o partizionato (slicing ) che consiste nell’estendere questo meccanismo per permette di selezionare una parte della lista. Se invece di scrivere un numero, scriviamo due numeri separati da due punti (start: end) Python interpreterà che vogliamo una lista che va dalla posizione iniziale (start) alla posizione finale (end), escludendo l’ultimo elemento. Se scriviamo tre numeri (start: end: jump) invece di due, la terza sarà utilizzata per determinare ogni quante posizioni aggiungere l’elemento alla lista.
			l = [99, True, "una lista", [1, 2]]
			mia_var = l[0:2] # mia_var vale [99, True]
			mia_var = l[0:4:2] # mia_var vale [99, "una lista"]
I numeri negativi possono anche essere utilizzati in uno slicing, con lo stesso comportamento cui sopra.
Si dovrebbe menzionare che non è necessario indicare l’inizio e la fine dello slicing: se questi sono omessi, verranno utilizzati di default le posizioni all’inizio e alla fine della lista, rispettivamente:
			l = [99, True, "una lista"]
			mia_var = l[1:] # mia_var vale [True, "una lista"]
			mia_var = l[:2] # mia_var vale [99, True]
			mia_var = l[:] # mia_var vale [99, True, "una lista"]
			mia_var = l[::2] # mia_var vale [99, "una lista"]
Possiamo utilizzare anche questo meccanismo per modificare la lista:
			l = [99, True, "una lista", [1, 2]]
			l[0:2] = [0, 1] # l vale [0, 1, "una lista", [1, 2]]
possiamo cambiare anche la dimensione della lista se la lista del lato destro dell’assegnazione è minore o maggiore della selezione del lato sinistro dell’assegnazione:
			l[0:2] = [False] # l vale [False, "una lista", [1, 2]]
In ogni caso, le liste forniscono meccanismi più comodi per modificarli tramite le funzioni della relativa classe. Tali meccanismi si vedrà più tardi, dopo aver spiegato cosa sono le classi, gli oggetti e le funzioni.
Tuple
Tutto quello che abbiamo detto sulle liste vale anche per le tuple, tranne come definirlo, per questo che si utilizzano le parentesi tonde al posto delle parentesi quadre.
			t = (1, 2, True, "python")
In realtà, il costruttore della tupla è la virgola e no le parentesi, ma l’interprete mostra le parentesi, e dovremmo usarle per chiarezza.
			>>> t = 1, 2, 3
			>>> type(t)
			type "tuple"
Inoltre, dobbiamo tenere conto che è necessario aggiungere una virgola al singolo elemento della tupla per differenziarlo da un elemento tra parentesi.
			>>> t = (1)
			>>> type(t)
			type "int"
			>>> t = (1,)
			>>> type(t)
			type "tuple"
Per fare riferimento agli elementi di una tupla, come in una lista, utilizzare l’operatore []:
			mi_var = t[0] # mi_var es 1
			mi_var = t[0:2] # mi_var es (1, 2)
Possiamo utilizzare l’operatore [] perché le tuple, come liste, fanno parte di un tipo di oggetti chiamati sequenze Lasciatemi segnalare che le stringhe di testo sono anche sequenze, in modo che non è strano il fatto che possiamo fare cose come queste:
			c = "Ciao Mondo"
			c[0] # C
			c[0:4] # Ciao
			c[5:] # Mondo
			c[::3] # Cooo
Ritornando al tema delle tuple, la differenza con le liste è che le tuple non hanno questi meccanismi di modifica attraverso le utili funzioni cui si è descritto alla fine della sezione precedente.
Inoltre sono immutabili, cioè i valori non possono essere modificati una volta creata, e hanno una dimensione fissa.
In cambio a queste limitazioni, le tuple sono più “leggere” delle liste; quindi l’uso che daremo a una collezione è molto basico ed è possibile utilizzare le tuple anziché le liste per risparmiare memoria.
Dizionari
I dizionari, detti anche array associativi, prendono questo nome perché sono collezioni che fanno riferimento a una chiave e a un valore. Ad esempio, vediamo un dizionario di film e registi:
			d = {"Love Actually ": "Richard Curtis",
				 "Kill Bill": "Tarantino",
				 "Amélie": "Jean-Pierre Jeunet"}
Il primo valore è la chiave e il secondo è il valore associato alla chiave. Come chiave si può usare qualsiasi valore immutabile: possiamo utilizzare numeri, stringhe, booleani, tuple … ma non liste o dizionari, giacché sono mutabili. Questo è così perché i dizionari vengono implementati come tabelle hash, e quando si aggiunge una nuova coppia chiave-valore nel dizionario si calcola lo hash della chiave per poi trovare rapidamente la voce corrispondente. Se l’oggetto chiave viene modificato dopo che si è aggiunto al dizionario cambia, naturalmente, anche il suo hash e non potrà essere trovato.
La differenza principale tra dizionari e le liste o le tuple è che i valori memorizzati in un dizionario, non sono accessibili tramite l’indice, perché in realtà non ha nessun ordine, ma con la chiave, utilizzando sempre l’operatore [].
			d["Love Actually "] # ritorna "Richard Curtis"
Come con le liste e le tuple si può anche utilizzare l’ operatore = per riassegnare valori.
			d["Kill Bill"] = "Quentin Tarantino"


Similari
Overloading di metodi in Java
12% Java
Un metodo overload viene utilizzato per riutilizzare il nome di un metodo ma con argomenti diversi, opzionalmente con un differente tipo di ritorno. [expand title=”Regole per overload” startwrap=”” endwrap=”” excerpt=”⤽” s…
Modi di fare e di non fare in Python
11% Python
Questo documento può essere considerato un compagno del tutorial di Python. Viene illustrato come utilizzare Python, e quasi ancora più importante, come non usare Python. [expand title=”Costrutti del linguaggio che non dov…
redirect 301 usando mod_alias
9% Server
mod_alias è fondamentalmente la versione più semplice di mod_rewrite. Non può fare le cose che fa mod_rewrite, ad esempio modificare la stringa di query. Per eseguire reindirizzamenti nel server web Apache è possibile di u…
Installare Python e Django su Windows
8% Django
Quando ci riferiamo allo sviluppo web con Python, la prima cosa che viene in mente è usare un qualche framework. Il più famoso e utilizzato da tutti è il Django, ma non è l’unico. Ci sono Pylons, Grok, TurboGears e Zope: t…
Metodi magici e costanti predefinite in PHP
8% Php
PHP fornisce un insieme di costanti predefinite e metodi magici per i nostri programmi. A differenza delle normali costanti i quali si impostano con define(), il valore delle costanti predefinite o speciali dipendono da do…