A Byte of Python

Dizionari

Un dizionario è simile ad una rubrica nella quale possiamo trovare l'indirizzo di una persona conoscendone solo il nome; in pratica associamo una chiave (nome) ad un valore (indirizzo). Si noti che la chiave deve essere unica: non è possibile trovare l'informazione corretta se due persone hanno esattemente lo stesso nome.

Come chiavi di indicizzazione si possono usare solo oggetti immutabili (ad esempio stringhe), mentre sono ammessi indifferentemente oggetti mutabili o immutabili come valori del dizionario.

Le coppie chiave-valore sono specificate in un dizionario usando la seguente notazione: d = {key1 : value1, key2 : value2 }. Da notare che le coppie chiave-valore sono separate dal carattere due punti (:), le coppie stesse sono separate tra loro dal carattere virgola (,) e tutto e racchiuso in una coppia di parentesi graffe.

C'è da ricordarsi che in un dizionario le coppie chiave-valore non sono ordinate in alcun modo. Se si sceglie di ordinarle secondo un criterio qualsiasi, occorre processare le coppie prima di usare il dizionario.

I dizionari sono istanze/oggetti della classe dict.

Usare i dizionari

Esempio 9.4. Usare i dizionari

				
#!/usr/bin/python
# Filename: using_dict.py

# 'ab' is short for 'a'ddress'b'ook

ab = {		'Swaroop'   : 'swaroopch@byteofpython.info',
		'Larry'     : 'larry@wall.org',
		'Matsumoto' : 'matz@ruby-lang.org',
		'Spammer'   : 'spammer@hotmail.com'
	}

print "Swaroop's address is %s" % ab['Swaroop']

# Aggiunta du una coppia chiave-valore
ab['Guido'] = 'guido@python.org'

# Rimozione della coppia chiave-valore
del ab['Spammer']

print '\nThere are %d contacts in the address-book\n' % len(ab)

for name, address in ab.items():
	print 'Contact %s at %s' % (name, address)

if 'Guido' in ab: # OR ab.has_key('Guido')
	print "\nGuido's address is %s" % ab['Guido']
				
				

Output

				
$ python using_dict.py
Swaroop's address is swaroopch@byteofpython.info

There are 4 contacts in the address-book

Contact Swaroop at swaroopch@byteofpython.info
Contact Matsumoto at matz@ruby-lang.org
Contact Larry at larry@wall.org
Contact Guido at guido@python.org

Guido's address is guido@python.org
				
				

Funzionamento

Si crea il dizionario ab seguendo la notazione precedentemente discussa. Accediamo poi alle coppie chiave-valore specificando la chiave ed usando l'indicizzazione come discusso nel contesto di liste e tuple. Si osserva innanzi tutto la stessa semplicità sintattica.

Per aggiungere una nuova coppia chiave-valore si usa semplicemente l'indicizzazione per accedere alla chiave e assegnarle quel valore, come è stato fatto nel caso di Guido.

Per cancellare una coppia chiave-valore possiamo ricorrere ad una vecchia conoscenza: il comando del. Il suo uso è davvero semplice: specifichiamo il dizionario e l'operatore di indicizzazione per rimuovere la chiave e passiamo il tutto all'istruzione del. Per questa operazione non è necessario conoscere a priori il valore che è associato alla chiave da rimuovere.

Successivamente accediamo ad ogni coppia chiave-valore del dizionario usando il metodo items che restituisce una lista di tuple ognuna delle quali contiene una coppia di elementi, cioè la chiave seguita dal valore vero e proprio. Richiamiamo questa coppia e la assegnamo alle variabili name e address corrispondenti mediante in semplice costrutto for..in che inoltre stampa questi valori.

Per controllare se una data coppia chiave-valore esiste, sono disponibili l' operatori in e il metodo has_key per la classe dict. La documentazione della lista completa dei metodi disponibili per la classe dict può essere consultata con il comando help(dict).

Argomenti a chiave e dizionari.  Una nota: se avete già usato gli argomenti a chiave in qualche funzione, senza rendervene conto avete già usato anche i dizionari! Infatti la coppia chiave-valore è stata specificata nella lista dei parametri nella definizione della funzione, e quando accediamo alle variabili all'interno della funzione in effetti usiamo la chiave di un dizionario (nel gergo dei compilatori si chiama tabella simbolica).