Python dizionari

Continuiamo a spiegare il concetto in Python dei dizionari attraverso degli esempi pratici.

Python dizionari – primo esempio

Scriviamo, dunque, un programma che genera un dizionario di n elementi che contiene delle coppie di valori (i, i * i) quindi valori del tipo {1: 1, 2: 4, 3: 6, … }.

Risolviamo l’algoritmo molto semplicemente. Chiediamo innanzitutto quanti elementi deve avere il dizionario. Dopo, con un ciclo for generiamo i valori.


n = int(input('Quanti elementi vuoi inserire?: '))
d = dict()
for i in range(1, n+1):
    d[i] = i * i

print(d)

Proviamo il codice direttamente nel compiler online sotto:

Python dizionari – secondo esempio

Facciamo un secondo esempi con i dizionari in Python.

Dato un dizionario dei contatti, composto da coppie di valori Nome: Telefono stampare dapprima tutti i valori con il metodo values() sui dizionari e dopo con un ciclo for stampare i telefoni.

Ecco una possibile soluzione:


contacts = {
    'Tom': '2345610',
    'Anna': '12345610',
    'Luca': '32345610',
    'Harry': '42345610'
}

contacts_values = contacts.values()
print(valori)

for phone in contacts_values:
    print(phone)

Potremmo anche stampare le keys, utilizzando il metodo keys() sul dizionario e con un ciclo for stampare i nomi. Di seguito ecco una possibile soluzione alla variazione all’algoritmo proposto.


contacts = {
    'Tom': '2345610',
    'Anna': '12345610',
    'Luca': '32345610',
    'Harry': '42345610'
}

contacts_names = contacts.keys()
print(contacts_names)

for name contacts_names:
    print(name)

Python dizionari – terzo esempio

Facciamo un ultimo esempio per fare ancora pratica con i dizionari.

Estrarre 4 carte da un mazzo di 40 ed inserirle in un dizionario. La chiave è costituita dal seme, mentre il valore dal numero.

Ecco una possibile soluzione all’algoritmo proposto (ci accorgeremo che è un procedimento errato e vi spiegherò anche il perché):


import random

def estrai():
  semi = ["Bastoni", "Coppe", "Denari", "Spade"]
  numeri = ["Asso",'Due','Tre','Quattro','Cinque',
  'Sei','Sette',"Fante","Cavallo","Re"]
  result = dict()
  
  for i in range(1,4):
    number = random.choice(numeri)
    seme = random.choice(semi)
    result[seme] = number
  return result

r = estrai()
print(r)

Se provate più volte l’algoritmo, nel compiler online sopra, vi accorgerete che non sempre il dizionario si popola di 4 elementi. Perchè avviene questo?

Come sappiamo, nei dizionari le chiavi devono essere uniche, questo vuol dire che ogni volta che l’algoritmo estrae una chiave che già è stata inserita, va avanti con il conteggio ma non inserisce nulla.

Dunque la soluzione corretta e più veloce si realizza con il ciclo while:


def estrai():
  semi = ["Bastoni", "Coppe", "Denari", "Spade"]
  numeri = ["Asso",'Due','Tre','Quattro','Cinque','Sei','Sette',"Fante","Cavallo","Re"]
  result = dict()
  print(len(result))
  
  while len(result)  4:
    number = random.choice(numeri)
    seme = random.choice(semi)
    result[seme] = number
  return result
  
r = estrai()
print(r)

Se provate nel compiler online la soluzione con il while, questa volta il dizionario si riempie esattamente di 4 elementi ogni volta. In questo caso infatti imposto una condizione: finchè il dizionario non ha 4 elementi continua ad estrarre elementi.

Abbiamo in questo modo risolto il problema delle chiavi duplicati per popolare i dizionari in Python.

Conclusioni

In questa lezione abbiamo affrontato alcuni esercizi di Python sui dizionari, nelle prossime lezioni ve ne proporrò tanti altri.

Alcuni link utili

Indice tutorial sul linguaggio Python

1 – Introduzione al linguaggio Python

2 – Le variabili

3 – Operatori aritmetici e di assegnazione

4 – Stringhe

5 – Casting

6 – Input e print

7 – Primi esercizi in Python

8 – Errori in Python

9 – Script Python

10 – Scambio di variabili

11 – Modulo math

Continua la lettura su: https://www.codingcreativo.it/python-dizionari/ Autore del post: Coding Creativo Fonte: https://www.codingcreativo.it

Articoli Correlati

Ordinare un dizionario in Python

Si può ordinare un dizionario in Python per chiave o per valore. Facciamo alcuni esempi pratici di ordinamento in Python in base alle nostre esigenze.

Tutti gli esempi proposti possono essere provati nel compiler online che troverete al seguente link: Python compiler online.

Primo esempio – Ordinare un dizionario in Python per chiave

In questo primo esempio dapprima creiamo un dizionario in Python. Abbiamo poi detto di ordinare per chiave, quindi dobbiamo decidere se seguire un ordine crescente o decrescente, infine dobbiamo richiamare la funzione sul dizionario.

Implementiamo, dunque, una prima soluzione. Per ordinare in senso crescente possiamo utilizzare la funzione sorted sul nostro dizionario, in questo modo:

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

for key in sorted(student):
print(key, student[key])

E se vogliamo un ordinamento decrescente? Basterà semplicemente utilizzare il parametro reverse della funzione sorted, impostandolo a False.

Ecco un esempio di dizionario ordinato in senso decrescente in Python:

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

for key in sorted(student, reverse = True):
print(key, student[key])

Secondo esempio – Ordinare un dizionario in Python per chiave

Cerchiamo adesso una seconda soluzione al problema proposto.

Innanzitutto potremmo ad esempio pensare di utilizzare il metodo keys() sul dizionario, ma cosa succede?

Proviamolo, dunque, con un esempio:

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

sorted_key = sorted(student.keys())

for element in sorted_key:
print(element)

In questo caso si avrà il seguente output:

age
hobby
mail
name
passion

Ovvero avremo le sole chiavi ordinate in senso crescente.

Quindi, anche se uso il metodo dict() non riuscirò in questo modo ad ordinare un dizionario in Python.

E se invece proviamo ad utilizzare il metodo values()?

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

sorted_values = sorted(student.values())

for element in sorted_values:
print(element)

Il risultato sarà il seguente:

29
Cristina
coding
codingcreatico@gmail.com
swim

Quindi se voglio ordinare un dizionario in Python per chiave cosa devo fare? Quale altra soluzione posso pensare?

Possiamo, ad esempio, utilizzare il metodo items(), che abbiamo studiato in questa lezione: items Python.

Ricordiamo inoltre che questo metodo è utilizzato per restituire l’elenco con tutte le chiavi del dizionario con i suoi rispettivi valori.

Dopo, possiamo nuovamente riconvertire le coppie di tuple in un dizionario utilizzando il metodo dict().

Ecco una possibile soluzione al nostro algoritmo:

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

sorted_student = sorted(student.items())
sorted_student_dict = dict(sorted(student.items()))

print(sorted_student_dict)

for element in sorted_student_dict:
print(element, ‘: ‘, sorted_student_dict[element])

Così abbiamo ottenuto tutte le coppie di tuple chiave, valori ordinate in senso crescente. Poi, convertiamolo in dizionario con il metodo dict(). Così riusciamo ad ordinare il dizionario in Python per chiave.

Utilizziamo una funzione per poterla poi utilizzare per creare l’ordinamento su più dizionari:

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

def sort_dict(d):
return dict(sorted(student.items()))

print(sort_dict(student))

Ordinare un dizionario in Python per chiave in senso decrescente

Questa volta utilizziamo il parametro reverse di sorted per creare un ordinamento decrescente sui dizionari. Infatti impostandolo a True l’ordinamento sarà decrescente. Di default il suo valore è False.

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

def sort_dict(d):
return dict(sorted(student.items(), reverse = True))

print(sort_dict(student))

Per completezza potremmo passare questo parametro anche alla funzione, in questo modo:

student = {
“name”: ‘Cristina’,
“age”: ’29’,
“hobby”: ‘swim’,
“mail”: ‘codingcreatico@gmail.com’,
“passion”: ‘coding’
}

def sort_dict(d, rev):
return dict(sorted(student.items(), reverse = rev))

print(sort_dict(student, True))

Conclusione

In questa lezione abbiamo affrontato alcuni interessanti esempi su come ordinare un dizionario in Python per chiave, in ordine crescente e decrescente.

Alcuni link utili

Indice tutorial sul linguaggio Python

1 – Introduzione al linguaggio Python

2 – Le variabili

3 – Operatori aritmetici e di assegnazione

4 – Stringhe

5 – Casting

6 – Input e print

7 – Primi esercizi in Python

8 – Errori in Python

9 – Script Python

10 – Scambio di variabili

11 – Modulo math

Aggiungere un numero random in un file

In questa lezione svilupperemo un semplice algoritmo per aggiungere un numero random in un file in Python.

Supponiamo di avere un file che contiene un numero.

Innanzitutto stampiamo il numero contenuto nel file, dopo generiamo un numero random e lo sommiamo al numero che è contenuto nel file.

Poi sommiamo i due numeri e aggiungiamo il numero così ottenuto al file, iniziando da una nuova riga.

Supponendo che il file number_random.txt contenga il numero 6, proviamo questo codice di esempio:

import random

f = open(‘number_random.txt’, ‘r+’)
numero = f.readline()
print(numero)

random_number = random.randint(1, 100)
print(random_number)

somma = random_number + int(numero)
print(somma)

f.write(‘n’ + str(somma))
f.close()

Occorre utilizzare la modalità r+ per poter aprire un file in lettura e scrittura contemporaneamente.

Ricordiamo inoltre che il metodo write() vuole una stringa, quindi dobbiamo convertire il numero ottenuto dalla lettura del file in una stringa utilizzando il casting con str().

Aggiungere un numero random in un file – secondo esempio

In questo secondo esempio cercheremo di indovinare il numero che è contenuto nel file di testo number.txt.

Supponendo che il file contenga un solo numero, apriamo il file in modalità di sola lettura e leggiamo il numero. Dopo chiediamo qual è il numero contenuto nel file e diamo un messaggio di vittoria o di sconfitta dopo averlo confrontato.

Sviluppiamo un possibile algoritmo che risolve il nostro problema utilizzando anche una semplice funzione:

f = open(‘number.txt’, ‘r’)
number = f.readline()

def indovina(num):
if num == number:
return True

my_number = input(‘Quale numero è contenuto nel file?: ‘)

risultato = indovina(my_number)

if risultato:
print(‘Hai indovinato!’)
else:
print(‘Non hai indovinato’)
print(‘Il numero era: ‘ + number)

Aggiungere un numero random in un file – terzo esempio

Adesso modifichiamo l’algoritmo dando degli aiuti all’utente. Ogni volta che l’utente proverà ad indovinare gli verrà detto se il numero pensato è più basso o più alto di quello contenuto nel file di testo.

Il tutto per 5 volte.

Quando siamo davanti ad un problema complesso dobbiamo scomporlo in sottoproblemi per renderlo più semplice.

Allora dapprima sviluppiamo il caso più semplice, cioè una sola risposta:

f = open(‘number.txt’, ‘r’)
number = f.readline()

def indovina(num):
if num == number:
return 0
elif num > number:
return 1
else:
return 2

my_number = input(‘Quale numero è contenuto nel file?: ‘)

risultato = indovina(my_number)

if risultato == 0:
print(‘Hai indovinato!’)
elif risultato == 1:
print(‘Il numero da indovinare è più basso’)
else:
print(‘Il numero da indovinare è più alto’)

Adesso generiamo i 5 tentativi, facendo in modo di terminare il gioco quando si finiscono i tentativi oppure quando si indovina.

Generiamo una prima soluzione nella quale usciremo dal ciclo attraverso l’uso di break:

f = open(‘number.txt’, ‘r’)
number = f.readline()

def indovina(num):
if num == number:
return 0
elif num > number:
return 1
else:
return 2

tentativi = 5

for i in range(tentativi):
my_number = input(‘Quale numero è contenuto nel file?: ‘)
risultato = indovina(my_number)
if risultato == 0:
print(‘Hai indovinato!’)
break
elif risultato == 1:
print(‘Il numero da indovinare è più basso’)
else:
print(‘Il numero da indovinare è più alto’)

Adesso creiamo una nuova funzione evitando così l’utilizzo del break:

f = open(‘number.txt’, ‘r’)
number = f.readline()

def indovina(num):
if num == number:
return 0
elif num > number:
return 1
else:
return 2

tentativi = 5
trovato = False

def gioco():
for i in range(tentativi):
my_number = input(‘Quale numero è contenuto nel file?: ‘)
risultato = indovina(my_number)
if risultato == 0:
print(‘Hai indovinato!’)
return
elif risultato == 1:
print(‘Il numero da indovinare è più basso’)
else:
print(‘Il numero da indovinare è più alto’)

gioco()

In questa lezione abbiamo sviluppato alcuni algoritmi come ad esempio aggiungere un numero random in un file in Python, oppure indovinare il numero contenuto in un file di testo. Nelle prossime lezioni ci eserciteremo ancora sui file.

Alcuni link utili

Indice tutorial sul linguaggio Python

1 – Introduzione al linguaggio Python

2 – Le variabili

3 – Operatori aritmetici e di assegnazione

4 – Stringhe

5 – Casting

6 – Input e print

7 – Primi esercizi in Python