Funzione letters to digits

r
rosario.salerno (3010 points)
12 30 44
asked Nov 27, 2017 in Programmare in Python by rosario.salerno (3,010 points)
closed Nov 27, 2017 by andrea.sterbini
Salve a tutti, per svolgere il seguente esercizio :

l2d(lst) presa in input una lista lst i cui elementi sono numeri da 0 a 9 espressi in lettere ('zero','uno', …,'nove'), ritorna una nuova lista i cui elementi sono la traduzione in numeri degli
elementi di lst. Esempio
l2d(['nove','due','due','tre'])  ritorna  [9,2,2,3]

Ho scritto la seguente funzione:

def l2d(lst):
    ...:     new = []
    ...:     for x in lst:
    ...:        if x == 'zero':
    ...:          new.append(0)
    ...:        elif x == 'uno':
    ...:          new.append(1)
    ...:        elif x == 'due':
    ...:          new.append(2)
    ...:        elif x == 'tre':
    ...:          new.append(3)
    ...:        elif x == 'quattro':
    ...:          new.append(4)
    ...:        elif x == 'cinque':
    ...:          new.append(5)
    ...:        elif x == 'sei':
    ...:          new.append(6)
    ...:        elif x == 'sette':
    ...:          new.append(7)
    ...:        elif x == 'otto':
    ...:          new.append(8)
    ...:        elif x == 'nove':
    ...:          new.append(9)
    ...:     return new
    ...:
    ...:

La funzione svolge il suo compito come previsto, ma come potete vedere il codice è molto lungo. Secondo voi la funzione è scritta correttamente in base alle richieste dell'esercizio o dovrei in qualche modo ridurre il codice? Se no, come potrei ridurre il codice evitando di importare moduli esterni che convertono automaticamente letters to digits?

Edit: come faccio a postare codice sul forum in modo leggibile?
218 views
closed with note: answered

1 Answer

Best answer
answered Nov 27, 2017 by Anon1 (9,920 points)
selected Nov 29, 2017 by rosario.salerno

Per ridurre il numero di if utilizzati, potresti utilizzare i dizionari. Come chiave metti il numero in forma letterale, come attributo il numero in forma numerica. Dopo aver fatto questa preparazione, puoi semplicemente sostituire tutti gli if aggiungendo il numero (trovato con il dizionario) nella lista, del tipo new.append(dizionario[x]).

Esistono però altri metodi, a me è venuto in mente questo!

LeonardoEmili (35740 points)
11 65 155
commented Nov 27, 2017 by LeonardoEmili (35,740 points)
Esatto, altrimenti una lista e metti ogni numero scritto a lettere in corrispondenza della sua posizione nella lista :D
commented Nov 27, 2017 by Anon1 (9,920 points)
Come proponi te non funzionerebbe, perché la lista è ordinata con un indice numerico, invece in questo caso gli serve un indice composto da caratteri (ossia stringa), quindi gli conviene usare i dizionari.
LeonardoEmili (35740 points)
11 65 155
commented Nov 27, 2017 by LeonardoEmili (35,740 points)
Pardon, leggendo numeri da 0 a 9 ho direttamente associato i numeri alle cifre numeriche. Decisamente il dizionario allora.
r
rosario.salerno (3010 points)
12 30 44
commented Nov 27, 2017 by rosario.salerno (3,010 points)
esatto, le stringhe possono essere in qualsiasi posizione e anche ripetersi, per esempio se la mia lista è = ['zero','nove','uno','uno'] la mia funzione ritorna [0,9,1,1].  Comunque visto che i dizionari sono più avanti nelle lezioni lo lascerò così per questo esercizio,  ma terrò conto di questo metodo, grazie.
P.S. qualcuno sa dirmi come posso scrivere il codice in modo leggibile sul forum? ho provato [CODE][/CODE] ma non funziona.
andrea.sterbini (172780 points)
514 935 1789
commented Nov 27, 2017 by andrea.sterbini (172,780 points)
C'è il bottone "QUOTE" (le due virgolette grandi)