DOMANDA Stampare variabili in ordine crescente - Python 3.5

Pubblicità

Tommaso Sala

Utente Attivo
Messaggi
868
Reazioni
140
Punteggio
46
Salve,
vorrei stampare a schermo un serie di variabili (a=100/(25-x), b=100/(25-y) e così via sino alla h) in ordine crescente ma non ho ben capito come usare sort.
 
Gli algoritmi di ordinamento funzionano su dati strutturati, come gli array (liste in python).
Il fatto che tu abbia tante variabili diverse da ordinare, mi fa supporre che il tuo programma non sia ben pensato... memorizza le variabili in una lista così da poter usare le funzioni di ordinamento.
Cosa farebbe questo programma di preciso?
 
Gli algoritmi di ordinamento funzionano su dati strutturati, come gli array (liste in python).
Il fatto che tu abbia tante variabili diverse da ordinare, mi fa supporre che il tuo programma non sia ben pensato... memorizza le variabili in una lista così da poter usare le funzioni di ordinamento.
Cosa farebbe questo programma di preciso?
il programma calcola le probabilità di essere estratti a sorte in una determinata disciplina. Peró non si può uscire due volte quindi si possono aggiungere dati. Quando si aggiunge un dato, ovvero un cognome eg. Rossi viene creato un file Rossi.txt nella cartella eg. Latino, poi calcolo il numero il numero di file in una cartella e faccio la proporzione per trovare la percentuale che stampo a schermo, la percentuale di una disciplina: latino, ad esempio, è abbinato alla variabile a, greco alla var b ecc ecc. Queste sono le variabili descritte nel primo post. Dopo volevo far stampare a schermo i risultati in ordine decrescente (ho visto che basta usare sort e poi reverse). Per mettere in lista intendi tot=[a,b,c,d,e,...,h]? Per tot.sort dà None
 
@1nd33d temo di essermi complicato la vita, e non poco. Per quanto riguarda questo problema avevo sbagliato la sintassi, ora però ho un problema ben più complesso. Ora ho semplicemente stampato a schermo le variabili in ordine decrescente poichè tutte le variabili sono numeri. Io ho la necessità di associare alle variabili una stringa per cui al posto di stampare >>>5 4,3 4,3 4 2 ecc stampi x (al posto di 5), y (al posto di 4,3), z (al posto dell'altro 4,3). Penso sia meglio allegare il codice.
Codice:
import os
def perc():
    ris = 100/(25-nf)
    print(ris,"%")
def uscita():
    e = int(input("Premi 0 per uscire e 1 per tornare al menù principale: "))
    if e == 0:
        exit()
    elif e == 1:
        main()
    else:
        print("Input non valido")
        return
lm=["Latino","Greco","Storia","Matematica","Scienze","Italiano"]
li=["Eneide","Grammatica","Promessi Sposi"]
ln=["Rossi","Bianchi","Cannavaro","Grosso","Marchisio","Falco","Chiellini","Bonucci","Renzi","Cimarosti","Cavani","Berlusconi","Gesù","Dybala","Morata","Nagatomo","Immobile","Gentiloni","Mattarella","Napolitano","Geppetto","Sala","Maria","Del Piero","Padoin"]
def main():
    a=input("Vuoi conoscere le probabilità, aggiungere dati o creare un piano di studio? 1|2|3: ")
    if a == "1":
        b = input("Indica la materia: ")
        if b in lm:
                if b == "Storia":
                    list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/sto')
                    if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/sto/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Italiano":
                    c = input("Seleziona un argomento specifico tra Eneide, Promessi Sposi e grammatica: ")
                    if c not in li:
                        print("Argomento inesistente!")
                        uscita()
                    else:
                        if c == "Eneide":
                            list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ene')                  
                            if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/ene/Sala.txt')==True:
                                print("0%")
                            else:
                                nf = int(len(list))                      
                                perc()
                        elif c == "Promessi Sposi":
                            list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ps')
                            if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/ene/Sala.txt')==True:
                                print("0%")
                            else:
                                nf = int(len(list))
                                perc()
                        elif c == "Grammatica":
                            list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/gra')
                            if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/gra/Sala.txt')==True:
                                print("0%")
                            else:
                                nf = int(len(list))
                                perc()                          
                elif b == "Matematica":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/mate')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/mate/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()  
                elif b == "Promessi Sposi":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/ps')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/ps/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Latino":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/lati')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/lati/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()          
                elif b == "Scienze":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/scie')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/scie/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Inglese":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/ing')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/ing/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Greco":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/gre')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/gre/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()              
                else:
                    print("Materia non valida!")
                    uscita()
        else:
            print("Materia non attesa, aggiorna la versione del software oppure manda un email a tomsala03@gmail.com")
            uscita()
    elif a=='2':
        n=input('Nome alunno da aggiungere:(eg: Sala): ')
        d=input('Indicare una materia: ')
        if d == "Storia" or d=="storia":
            open('C:/Users/SUINO/Desktop/python/prob/cache/sto/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Inglese" or d=="inglese":
            open('C:/Users/SUINO/Desktop/python/prob/cache/ing/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Matematica":
            open('C:/Users/SUINO/Desktop/python/prob/cache/mat/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Scienze" or d=="scienze":
            open('C:/Users/SUINO/Desktop/python/prob/cache/scie/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Eneide" or d=="eneide":
            open('C:/Users/SUINO/Desktop/python/prob/cache/ene/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Promessi Sposi" or d=="promessi sposi":
            open('C:/Users/SUINO/Desktop/python/prob/cache/ps/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Grammatica" or d=="grammatica":
            open('C:/Users/SUINO/Desktop/python/prob/cache/gra/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Latino" or d=="latino":
            open('C:/Users/SUINO/Desktop/python/prob/cache/lat/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Greco"  or d=="greco":
            open('C:/Users/SUINO/Desktop/python/prob/cache/gre/'+n+'.txt','w')
            print("Aggiunto!")
        else:
            print("Materia non valida")
            uscita()
    elif a=="3":
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/sto')
        nf = int(len(list))
        a=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/gre')
        nf=int(len(list))
        b=100/(25-nf)
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ene')
        nf = int(len(list))
        c=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ing')
        nf=int(len(list))
        d=100/(25-nf)
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/gra')
        nf = int(len(list))
        e=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/lati')
        nf=int(len(list))
        f=100/(25-nf)
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/scie')
        nf = int(len(list))
        g=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/mate')
        nf=int(len(list))
        h=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ps')
        nf=int(len(list))
        i=100/(25-nf)
        tot=[a,b,c,d,e,f,g,h]
        tot.sort(reverse=True)
        print(tot)
    else:
        print("Input non valido")
main()
uscita()
 
temo di essermi complicato la vita, e non poco
Decisamente si... faccio un po' fatica a capire il senso del tutto, anche il modo in cui calcoli le probabilità. Il motivo per cui sort restituisce None è che è un sort inplace, non resistuisce una nuova lista ma ordina la lista originaria. Se vuoi creare una nuova lista indipendente e ordinata, devi usare sorted (controlla sempre la documentazione python).

Comunque l'uso dei file è irragionevole. Se ho ben capito ti servono solo come "segnaposto" ma di fatto non ci scrivi nulla dentro. Ti basterebbe un singolo file o addirittura una struttura dati che permanga per la sola esecuzione del programma (a meno che non ti serva tenere traccia di tutto anche dopo aver chiuso il programma).
 
Ultima modifica:
Sì mi serve poter mantenere i dati dopo la chiusura del programma e l'idea di creare dei file mi è sembrata quella più semplice (visto che comunque essendo vuoti non occuperei spazio sul pc). Ad usare un singolo file ci avevo pensato ma non ci ho capito una mazza spulciando su internet. Tu come mi consigli di procedere (anzi di antecedere e poi di procedere a questo punto). Più che altro mi serve una logica...
 
Per quello che devi fare, ti consiglierei un dizionario.
Come chiavi usi le materie, come valori usi liste di nomi.
Per aggiungere una persona a una materia fai:
Python:
dati.setdefault(materia, list()).append(nome_persona)
Per sapere quante persone ci sono per una materia:
Python:
len(dati.get(materia, list()))
Per esempio:
Python:
dati = dict()
dati.setdefault('Matematica', list()).append('Luca')
dati.setdefault('Storia', list()).append('Giovanni')
dati.setdefault('Eneide', list()).append('Matteo')
dati.setdefault('Matematica', list()).append('Euclide')
dati.setdefault('Inglese', list()).append('John')
dati.setdefault('Inglese', list()).append('Mike')
dati.setdefault('Matematica', list()).append('Luigi')

print(dati)
print(len(dati.get('Inglese', list())))
print(len(dati.get('Matematica', list())))
{'Storia': ['Giovanni'], 'Eneide': ['Matteo'], 'Inglese': ['John', 'Mike'], 'Matematica': ['Luca', 'Euclide', 'Luigi']}
2
3
Il vantaggio di questo approccio è che non hai bisogno di tutti quegli orribili if-elif, in quanto il dizionario da se gestisce l'organizzazione dei dati.
Eventualmente puoi sempre controllare che il nome delle materie sia tra quelli ammessi, il dizionario accetta qualsiasi input.

Se vuoi salvare lo stato delle "stanze", puoi usare il modulo json.
Python:
import json
#salva il dizionario su file
with open('nomefile.json', 'wt') as file_out:
   json.dump(dati, file_out)
#recupera da file
with open('nomefile.json', 'rt') as file_in:
   dati = json.load(file_in)
 
@1nd33d temo di essermi complicato la vita, e non poco. Per quanto riguarda questo problema avevo sbagliato la sintassi, ora però ho un problema ben più complesso. Ora ho semplicemente stampato a schermo le variabili in ordine decrescente poichè tutte le variabili sono numeri. Io ho la necessità di associare alle variabili una stringa per cui al posto di stampare >>>5 4,3 4,3 4 2 ecc stampi x (al posto di 5), y (al posto di 4,3), z (al posto dell'altro 4,3). Penso sia meglio allegare il codice.
Codice:
import os
def perc():
    ris = 100/(25-nf)
    print(ris,"%")
def uscita():
    e = int(input("Premi 0 per uscire e 1 per tornare al menù principale: "))
    if e == 0:
        exit()
    elif e == 1:
        main()
    else:
        print("Input non valido")
        return
lm=["Latino","Greco","Storia","Matematica","Scienze","Italiano"]
li=["Eneide","Grammatica","Promessi Sposi"]
ln=["Rossi","Bianchi","Cannavaro","Grosso","Marchisio","Falco","Chiellini","Bonucci","Renzi","Cimarosti","Cavani","Berlusconi","Gesù","Dybala","Morata","Nagatomo","Immobile","Gentiloni","Mattarella","Napolitano","Geppetto","Sala","Maria","Del Piero","Padoin"]
def main():
    a=input("Vuoi conoscere le probabilità, aggiungere dati o creare un piano di studio? 1|2|3: ")
    if a == "1":
        b = input("Indica la materia: ")
        if b in lm:
                if b == "Storia":
                    list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/sto')
                    if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/sto/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Italiano":
                    c = input("Seleziona un argomento specifico tra Eneide, Promessi Sposi e grammatica: ")
                    if c not in li:
                        print("Argomento inesistente!")
                        uscita()
                    else:
                        if c == "Eneide":
                            list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ene')                 
                            if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/ene/Sala.txt')==True:
                                print("0%")
                            else:
                                nf = int(len(list))                     
                                perc()
                        elif c == "Promessi Sposi":
                            list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ps')
                            if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/ene/Sala.txt')==True:
                                print("0%")
                            else:
                                nf = int(len(list))
                                perc()
                        elif c == "Grammatica":
                            list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/gra')
                            if os.path.exists('C:/Users/SUINO/Desktop/python/prob/cache/gra/Sala.txt')==True:
                                print("0%")
                            else:
                                nf = int(len(list))
                                perc()                         
                elif b == "Matematica":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/mate')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/mate/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc() 
                elif b == "Promessi Sposi":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/ps')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/ps/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Latino":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/lati')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/lati/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()         
                elif b == "Scienze":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/scie')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/scie/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Inglese":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/ing')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/ing/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()
                elif b == "Greco":
                    list = os.listdir('C:/Users/SUINO/Desktop/prob/python/cache/gre')
                    if os.path.exists('C:/Users/SUINO/Desktop/prob/python/cache/gre/Sala.txt')==True:
                        print("0%")
                    else:
                        nf = int(len(list))
                        perc()             
                else:
                    print("Materia non valida!")
                    uscita()
        else:
            print("Materia non attesa, aggiorna la versione del software oppure manda un email a tomsala03@gmail.com")
            uscita()
    elif a=='2':
        n=input('Nome alunno da aggiungere:(eg: Sala): ')
        d=input('Indicare una materia: ')
        if d == "Storia" or d=="storia":
            open('C:/Users/SUINO/Desktop/python/prob/cache/sto/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Inglese" or d=="inglese":
            open('C:/Users/SUINO/Desktop/python/prob/cache/ing/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Matematica":
            open('C:/Users/SUINO/Desktop/python/prob/cache/mat/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Scienze" or d=="scienze":
            open('C:/Users/SUINO/Desktop/python/prob/cache/scie/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Eneide" or d=="eneide":
            open('C:/Users/SUINO/Desktop/python/prob/cache/ene/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Promessi Sposi" or d=="promessi sposi":
            open('C:/Users/SUINO/Desktop/python/prob/cache/ps/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Grammatica" or d=="grammatica":
            open('C:/Users/SUINO/Desktop/python/prob/cache/gra/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Latino" or d=="latino":
            open('C:/Users/SUINO/Desktop/python/prob/cache/lat/'+n+'.txt','w')
            print("Aggiunto!")
        elif d == "Greco"  or d=="greco":
            open('C:/Users/SUINO/Desktop/python/prob/cache/gre/'+n+'.txt','w')
            print("Aggiunto!")
        else:
            print("Materia non valida")
            uscita()
    elif a=="3":
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/sto')
        nf = int(len(list))
        a=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/gre')
        nf=int(len(list))
        b=100/(25-nf)
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ene')
        nf = int(len(list))
        c=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ing')
        nf=int(len(list))
        d=100/(25-nf)
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/gra')
        nf = int(len(list))
        e=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/lati')
        nf=int(len(list))
        f=100/(25-nf)
        list = os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/scie')
        nf = int(len(list))
        g=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/mate')
        nf=int(len(list))
        h=100/(25-nf)
        list=os.listdir('C:/Users/SUINO/Desktop/python/prob/cache/ps')
        nf=int(len(list))
        i=100/(25-nf)
        tot=[a,b,c,d,e,f,g,h]
        tot.sort(reverse=True)
        print(tot)
    else:
        print("Input non valido")
main()
uscita()

Forse al posto di tutte quelle if qualche" switch() case " non guasterebbe :sisi:
 
Se ci fosse lo switch, non sarebbe python :asd:
Si giustamente come mi hai fatto ricordare python non ha switch/case, mea culpa uso python veramente poco, ma in questo caso mi pare che l'alternativa migliore fosse il dictionary mapping se non erro, visto che visto da qualcuno quel codice sarebbe da suicidio scritto in quella maniera soprattutto in ambito python dove tutto dovrebbe essere corto. Ancora non ho analizzato tutto il codice ma a prima vista un altro errore di programmazione è quello di fare:
Codice:
elif d == "Grammatica" or d=="grammatica":

Se non utilizzi caratteri complessi basta che metti il tutto sotto .lower()
 
Ultima modifica:
Si giustamente come mi hai fatto ricordare python non ha switch/case, mea culpa uso python veramente poco, ma in questo caso mi pare che l'alternativa migliore fosse il dictionary mapping se non erro, visto che visto da qualcuno quel codice sarebbe da suicidio scritto in quella maniera soprattutto in ambito python dove tutto dovrebbe essere corto. Ancora non ho analizzato tutto il codice ma a prima vista un altro errore di programmazione è quello di fare:
Codice:
elif d == "Grammatica" or d=="grammatica":

Se non utilizzi caratteri complessi basta che metti il tutto sotto .lower()
grazie mille per questa dritta! Mi serviva anche questo effettivamente. Provo con i dizionari...anche se non gli ho mai usati anche se gli avevo visti in una guida che ho scaricato. Sono al corrente del fatto che il mio programma non sia costruito molto bene :ops:: migliorerò :ok:.
A proposito conoscete per caso la guida di Allen Downey sul Python? Sto usando questa per ora. Consigliate qualcos'altro in particolar per un autodidatta principiante?
 
Pubblicità
Pubblicità

Discussioni Simili

Indietro
Top