Matrice dati

di il
12 risposte

Matrice dati

Salve, propongo un codice relativo alla gestione di matrici: data una tabella che contiene le prestazioni erogate da un'officina in una particolare giornata di lavoro [id prestazione, tipo, costo] , restituire una lista che contiene il ricavo totale per ogni tipo di prestazione. Non riesco ad individuare l'errore purtroppo. Ecco il codice:
def officina(Prestazioni):
    listinoTot=[]
    motore=["Motore"]
    cambio=["Cambio"]
    revisione=["Revisione"]
    totmot=0
    totc=0
    totrev=0
    for i in range(len(Prestazioni)):
        for j in range(len(Prestazioni[0])):
            if(Prestazioni[i][1] == "motore"):
                totmot+=Prestazioni[i][2]
            elif(Prestazioni[i][1] == "cambio"):
                totc+=Prestazioni[i][2]
            elif(Prestazioni[i][1] == "revisione"):
                totrev+=Prestazioni[i][2]
    motore.append(totmot)
    revisione.append(totrev)
    cambio.append(totc)
    listinoTot.append(motore)
    listinoTot.append(revisione)
    listinoTot.append(cambio)
    return(listinoTot)

Prestazioni=[["m1", "motore", 1250],
             ["c1", "cambio", 375],
             ["r1", "revisione", 80],
             ["c2", "cambio", 375],
             ["r2", "revisione", 80]]

print(officina(Prestazioni))

12 Risposte

  • Re: Matrice dati

    Non ti servono due for annidati, basta quello esterno. Sostituisci il for interno con una cascata if ... elif e tutto funzionerà a dovere.
  • Re: Matrice dati

    Grazie mille per la risposta, smanettando un po' avevo individuato il problema; non serviva scorrere le colonne della tabella in effetti (errore grossolano).
    Se volessi implementare un codice per trovare il massimo tra i totali di tutte le prestazioni devo necessariamente farlo prima del return listinoTot oppure in alternativa definire un'altra funzione?
  • Re: Matrice dati

    Chuck10 ha scritto:


    Se volessi implementare un codice per trovare il massimo tra i totali di tutte le prestazioni devo necessariamente farlo prima del return listinoTot oppure in alternativa definire un'altra funzione?
    Dipende da cosa ti serve dopo. Se la cosa finisce lì, puoi farlo dentro la funzione, altrimenti fai una funzione separata. Puoi usare anche il metodo sort delle liste con una funzione che ritorna il secondo campo:
    def officina(Prestazioni):
        listinoTot=[]
        motore=["Motore", 0]
        cambio=["Cambio", 0]
        revisione=["Revisione", 0]
        for i in range(len(Prestazioni)):
            if Prestazioni[i][1] == "motore":
                motore[1] += Prestazioni[i][2]
            elif Prestazioni[i][1] == "cambio":
                cambio[1] += Prestazioni[i][2]
            elif Prestazioni[i][1] == "revisione":
                revisione[1] += Prestazioni[i][2]
        listinoTot.append(motore)
        listinoTot.append(revisione)
        listinoTot.append(cambio)
        listinoTot.sort(key = lambda prestazione : prestazione[1])
        return(listinoTot)
  • Re: Matrice dati

    In questo caso la funzione sort ordina dal massimo al minimo i valori e la funzione lambda seleziona la colonna di listinoTot sulla quale eseguire questa operazione, giusto?
  • Re: Matrice dati

    Si. Se vuoi puoi anche invertire l'ordinamento usando il parametro 'reverse = True'.
  • Re: Matrice dati

    Ok Grazie! meglio il primo procedimento che hai proposto, è stata una buona occasione per vedere all'opera la funzione lambda in questo caso particolare , mi era capitato poche volte di usarla ma solo su operazioni semplici.
  • Re: Matrice dati

    ...ho provato ad implementare questa parte di codice, per farmi dare in output la stringa corrispondente alla prestazione con ricavo Max, ma non funziona e non riesco a capire dove sia l'errore (specifico che sto per scrivere solo la parte del codice alla quale mi riferisco, implementato al programma precedente):
    return(listinotot)
    colonna = []
    for i in range(len(listinotot)):
       colonna.append(listinotot[i][1])
    for j in range(len(listinotot)):
        if max(colonna) == listinotot[j][1]:
            return listinotot[j][0]
  • Re: Matrice dati

    Implementato così non funzionerà MAI.
    listinotot è una variabile locale di officina, nel main non esiste.
    La lista ritornata dalla funzione 'officina' è ordinata in ordine crescente di ricavo, quindi il ricavo maggiore è nell'ultimo record:
    sommaPrestazioni = officina(Prestazioni)
    print("Il ricavo maggiore è sulla prestazione {}, con totale {} €.".format(sommaPrestazioni[-1][0], sommaPrestazioni[-1][1]))
  • Re: Matrice dati

    Grazie per la risposta, tutto molto chiaro! sicuramente una soluzione molto più compatta.
    Se invece volessi che listinotot fosse una variabile accessibile dalla parte di codice che ho scritto successivamente, sono corrette queste due opzioni?
    1) scrivere fuori (e prima) dalla funzione officina la variabile listinotot=[]
    oppure
    2) tenere listinotot nella funzione officina ma settarla come listinotot=global([])
  • Re: Matrice dati

    Chuck10 ha scritto:


    Se invece volessi che listinotot fosse una variabile accessibile dalla parte di codice che ho scritto successivamente, sono corrette queste due opzioni?
    1) scrivere fuori (e prima) dalla funzione officina la variabile listinotot=[]
    oppure
    2) tenere listinotot nella funzione officina ma settarla come listinotot=global([])
    Nessuna delle due (a meno che il vettore sia enorme).
    Fai ritornare il vettore listinotot dalla funzione e te lo copi in una variabile. Meno variabili globali ci sono in giro, meglio è.
  • Re: Matrice dati

    Ah ok. Ma non sono proprio corrette come soluzioni oppure non sono "convenienti"? Come mai non conviene avere troppe funzioni global tra i piedi, per un discorso di memoria? (scusa se insisto su questa discussione, cerco di chiedere a chi ne sa più di me per capire meglio e soprattutto imparare. Non sempre sui libri si trova tutto purtroppo).
  • Re: Matrice dati

    L'uso delle variabili globali (non delle funzioni!) dovrebbe essere ridotto al minimo indispensabile, perché Python ha un ambito globale e uno locale, e l'uso di variabili globali (dichiarate nell'ambito globale) in un ambito locale è limitato alla sola lettura, a meno di non usare l'identificatore global.
    Ad esempio (funzione con sole variabili locali):
    def fun1(x):
        x += 2
        return x
    
    La puoi richiamare da console con qualunque parametro numerico:
    >>> fun1(5)
    7
    Se scegli le variabili globali (funzione con sole variabili globali):
    x = 15
    def fun2():
        global x
        x += 2
        return x
    Con il risultato che a ogni chiamata di fun2() x viene incrementata di 2...
    >>>fun2()
    17
    >>> fun2()
    19
    A meno di non usare una versione diversa (funzione con variabili globali e locali):
    x = 15
    def fun3():
        y = x
        y += 2
        return y
    che però è più simile alla versione con sole variabili locali. Inoltre una funzione che usa variabili globali non può essere importata in un altro modulo (a meno di non ricreare anche le variabili globali).
Devi accedere o registrarti per scrivere nel forum
12 risposte