[Python] Dimensionare serbatoio

gerardoflotta
Buongiorno, mi sono imbattuto su questo esercizio ma non so proprio come cominciare. Non ho capito come fare il grafico. Qualcuno mi potrebbe spiegare come fare?

Grazie


Risposte
apatriarca
La libreria standard per fare grafici usando Python è matplotlib. In questa pagina puoi trovare un semplice esempio di utilizzo della funzione [tt]matplotlib.pyplot.plot[/url] che permette di fare semplici grafici come quello che ti è stato richiesto.

Incontri altre difficoltà?

gerardoflotta
Più avanti nell'esercizio chiede di leggere un file txt e ordinarlo, di leggerlo lo so leggere ma poi non so scrivere la funzione per ordinarlo

gerardoflotta


Questa parte fa riferimento al file txt, di leggerlo lo so leggere ma poi quando devo andare a fare la funzione per ordinarla no

apatriarca
Qui vengono spiegate le funzioni per l'ordinamento in Python. Siccome ogni riga ha diversi campi dovrai fare uso dell'argomento [tt]key[/tt] di queste funzioni per specificare in base a quale campo debbano essere ordinate.

Umby2
Una piccola critica al testo:

non ci sta alcuna necessità di leggere il file ordinato, per poter rispondere alla seconda parte del programma (mi riferisco alla sezione "implementare un secondo programma... etc. etc."

Volendo, il programma potrebbe essere unico, durante la lettura iniziale dei record, potrebbero essere calcolati i valori richiesti.

gerardoflotta
Grazie apatriarca per le pagine consigliate.

Umby e come dovrei fare?

gerardoflotta
class Serbatoio:
    
    def __init__(self, Identificativo, DataCostruzione, Comune, Capienza, SuperficieOccupata, Uso) :
        self.Identificativo = Identificativo
        self.DataCostruzione = DataCostruzione
        self.Comune = Comune
        self.Capienza = Capienza
        self.SuperficieOccupata = SuperficieOccupata
        self.Uso = Uso
        
        
    def __str__(self) :
        Elenco = "Caratteristiche Serbatoio:\n Identificativo: "+self.Identificativo+"\n DataCostruzione: "+self.DataCostruzione+"\n Comune: "+self.Comune+"\n Capienza: "+self.Capienza+"\n SuperficieOccupata: "+self.SuperficieOccupata+"\n Uso: "+self.Uso
        print()
        return Elenco
    
    def __gt__(self, other) :
        if self.Capienza > other.Capienza:
            return True
        else :
            return False
        
        
    
    
def stampa(lista):
    for elem in lista:
        print(elem)
        
def mediana(ListaSerbatoi):
    for Capienza in ListaSerbatoi:
        mediana = (Capienza + 1 / 2)
        print(mediana)
        

        
def main():
    ListaSerbatoi = []
    Serbatoio_1 = Serbatoio("SRB_01", "10-10-2018", "Cosenza", "500 m^3", "5 m^2", "Raccolta degli additivi del calcestruzzo")
    Serbatoio_2 = Serbatoio("SRB_02", "15-12-2019", "Crotone", "450 m^3", "4 m^2", "Raccolta del gasolio in ambiente esterno")
    Serbatoio_3 = Serbatoio("SRB_03", "20-11-2019", "Melissa", "700 m^3", "8 m^2", "Raccolta e conservazione acqua")
    Serbatoio_4 = Serbatoio("SRB_04", "30-12-2018", "Rende", "300 m^3", "15 m^2", "Raccolta oli alimentari")
    Serbatoio_5 = Serbatoio("SRB_05", "01-05-2020", "Caloveto", "100 m^3", "2 m^2", "Raccolta acqua piovana")
    
    ListaSerbatoi.append(Serbatoio_1)
    ListaSerbatoi.append(Serbatoio_2)
    ListaSerbatoi.append(Serbatoio_3)
    ListaSerbatoi.append(Serbatoio_4)
    ListaSerbatoi.append(Serbatoio_5)    
    
    stampa(ListaSerbatoi)
    print()
    print("Lista Serbatoi ordinata in modo crescente in funzione della 'Capienza': ")
    print()
    ListaSerbatoi.sort()
    stampa(ListaSerbatoi)
    print()
    mediana = mediana(ListaSerbatoi)
    print(mediana)
    
    
    
main()


questa classe fa parte anche dell'esercizio in cui chiede di creare una lista di serbatoi e poi ordinarla in base alla capienza in modo crescente e fino a qua ci siamo, subito dopo mi chiede di calcolare la mediana statistica ma non so scrivere la funzione, quella che ho scritto io è sbalgiata. Qualcuno a qualche consiglio

gerardoflotta
mediana statistica riferita alla capienza della listaserbatoi ordinata

Umby2
"crynow":
Grazie apatriarca per le pagine consigliate.

Umby e come dovrei fare?


Python lo conosco pochissimo, non vorrei darti info errate...

Era solo per dire che,
non è necessario ordinare la lista, per poter rispondere alle domande successive. :smt023

apatriarca
NdM: Ti ho modificato il post in modo da inserire il codice in un blocco CODE. Premi modifica sul tuo post per vedere come ho fatto. In python la formattazione è fondamentale ed è quindi importante che venga mantenuta quando lo inserisci nel forum.

apatriarca
La mediana statistica è semplicemente l'elemento intermedio (lunghezza dispari) o la media dei due centrali (lunghezza pari) di un array ordinato. Si può calcolare usando le funzioni [tt]numpy.median[/tt] o [tt]statistics.median[/tt] ma siccome hai un array ordinato è più semplice scrivere qualcosa come (questo codice calcola la mediana di una lista a):
n = len(a)
if n % 2 != 0:
    return 0.5 * (a[n//2-1] + a[n//2])
else:
    return a[n//2]


Ovviamente devi modificare il codice per sommare i valori che ti interessano in quanto non puoi sommare istanze della tua classe come nel codice che ho scritto.

gerardoflotta
def __int__(self):
        Mediana = []
        for self.Capienza in ListaSerbatoi:
            if self.Capienza % 2 != 0 :
                return 0.5 * (a[n//2-1] + a[n//2])
            else :
                return a[n//2]
        return Mediana


tipo una cosa cosi? Cosi non mi viene
non so proprio

gerardoflotta
la funzione la devo richiamare nella classe o nel main?

Umby2
"crynow":

tipo una cosa cosi? Cosi non mi viene
non so proprio


code.... non cose... :smt023

gerardoflotta
class Serbatoio:
    
    def __init__(self, Identificativo, DataCostruzione, Comune, Capienza, SuperficieOccupata, Uso) :
        self.Identificativo = Identificativo
        self.DataCostruzione = DataCostruzione
        self.Comune = Comune
        self.Capienza = Capienza
        self.SuperficieOccupata = SuperficieOccupata
        self.Uso = Uso
        
        
    def __str__(self) :
        Elenco = "Caratteristiche Serbatoio:\n Identificativo: "+self.Identificativo+"\n DataCostruzione: "+self.DataCostruzione+"\n Comune: "+self.Comune+"\n Capienza: "+self.Capienza+"\n SuperficieOccupata: "+self.SuperficieOccupata+"\n Uso: "+self.Uso
        print()
        return Elenco
    
    def __gt__(self, other) :
        if self.Capienza > other.Capienza:
            return True
        else :
            return False
       
        
    
    
def stampa(lista):
    for elem in lista:
        print(elem)
        
    
    
def main():
    ListaSerbatoi = []
    Serbatoio_1 = Serbatoio("SRB_01", "10-10-2018", "Cosenza", "500 m^3", "5 m^2", "Raccolta degli additivi del calcestruzzo")
    Serbatoio_2 = Serbatoio("SRB_02", "15-12-2019", "Crotone", "450 m^3", "4 m^2", "Raccolta del gasolio in ambiente esterno")
    Serbatoio_3 = Serbatoio("SRB_03", "20-11-2019", "Melissa", "700 m^3", "8 m^2", "Raccolta e conservazione acqua")
    Serbatoio_4 = Serbatoio("SRB_04", "30-12-2018", "Rende", "300 m^3", "15 m^2", "Raccolta oli alimentari")
    Serbatoio_5 = Serbatoio("SRB_05", "01-05-2020", "Caloveto", "100 m^3", "2 m^2", "Raccolta acqua piovana")
    
    ListaSerbatoi.append(Serbatoio_1)
    ListaSerbatoi.append(Serbatoio_2)
    ListaSerbatoi.append(Serbatoio_3)
    ListaSerbatoi.append(Serbatoio_4)
    ListaSerbatoi.append(Serbatoio_5)    
    
    stampa(ListaSerbatoi)
    print()
    print("Lista Serbatoi ordinata in modo crescente in funzione della 'Capienza': ")
    print()
    ListaSerbatoi.sort()
    stampa(ListaSerbatoi)
    print()
    

    
    
   
main()



Non so proprio come scrivere la funzione della mediana statistica in riferimento alla lista ordinata, ci sono da due giorni su questo punto.
Qualche anima pia che mi puo aiutare

vict85
A parte che apatriarca te lo ha già scritto, cos'è la mediana? Che rapporto ha con la lista ordinata?

gerardoflotta
mediana statistica.
devo fare la mediana della capienza della lista ordinata
ma non so proprio come scriverla

ancora sono bloccato a quel punto del codice delle domande di prima

apatriarca
Prima di tutto la mediana non è qualcosa che appartiene ad un singolo serbatoio, ma ad un insieme/lista di serbatoi. Quindi non può e non deve essere un campo della classe come hai tentato di fare nel tuo codice. Nel codice che ti avevo scritto la condizione del blocco if è calcolata a partire dalla dimensione della lista, certamente non dalla capienza di un particolare serbatoio. Di fatto si tratta semplicemente di scrivere una funzione come la seguente:
def mediana_capienze(serbatoi):
    n = len(serbatoi)
    if n == 0:
        return 0
    elif n & 2 == 0:
        return 0.5 * (serbatoi[n//2-1].Capienza + serbatoi[n//2].Capienza)
    else:
        return serbatoi[n//2].Capienza

La lista passata alla funzione deve essere già ordinata ovviamente.

NOTA: mi sono accorto che avevo scritto la condizione al contrario nel codice precedente. Qui è quella corretta.

gerardoflotta
Prima cosa grazie di vero cuore se mi state aiutando.

Ho scritto cosi:


class Serbatoio:
    
    def __init__(self, Identificativo, DataCostruzione, Comune, Capienza, SuperficieOccupata, Uso) :
        self.Identificativo = Identificativo
        self.DataCostruzione = DataCostruzione
        self.Comune = Comune
        self.Capienza = Capienza
        self.SuperficieOccupata = SuperficieOccupata
        self.Uso = Uso
        
        
    def __str__(self) :
        Elenco = "Caratteristiche Serbatoio:\n Identificativo: "+self.Identificativo+"\n DataCostruzione: "+self.DataCostruzione+"\n Comune: "+self.Comune+"\n Capienza: "+self.Capienza+"\n SuperficieOccupata: "+self.SuperficieOccupata+"\n Uso: "+self.Uso
        print()
        return Elenco
    
    def __gt__(self, other) :
        if self.Capienza > other.Capienza:
            return True
        else :
            return False
     

def mediana_capienze(ListaSerbatoi):
    n = len(ListaSerbatoi)
    if n == 0:
        return 0
    elif n & 2 == 0:
        return 0.5 * (ListaSerbatoi[n//2-1].Capienza + ListaSerbatoi[n//2].Capienza)
    else :
        return ListaSerbatoi[n//2].Capienza
    

def stampa(lista):
    for elem in lista:
        print(elem)
        

    
def main():
    ListaSerbatoi = []
    Serbatoio_1 = Serbatoio("SRB_01", "10-10-2018", "Cosenza", "500 m^3", "5 m^2", "Raccolta degli additivi del calcestruzzo")
    Serbatoio_2 = Serbatoio("SRB_02", "15-12-2019", "Crotone", "280 m^3", "4 m^2", "Raccolta del gasolio in ambiente esterno")
    Serbatoio_3 = Serbatoio("SRB_03", "20-11-2019", "Melissa", "700 m^3", "8 m^2", "Raccolta e conservazione acqua")
    Serbatoio_4 = Serbatoio("SRB_04", "30-12-2018", "Rende", "300 m^3", "15 m^2", "Raccolta oli alimentari")
    Serbatoio_5 = Serbatoio("SRB_05", "01-05-2020", "Caloveto", "100 m^3", "2 m^2", "Raccolta acqua piovana")
    
    ListaSerbatoi.append(Serbatoio_1)
    ListaSerbatoi.append(Serbatoio_2)
    ListaSerbatoi.append(Serbatoio_3)
    ListaSerbatoi.append(Serbatoio_4)
    ListaSerbatoi.append(Serbatoio_5)    
    
    stampa(ListaSerbatoi)
    print()
    print("Lista Serbatoi ordinata in modo crescente in funzione della 'Capienza': ")
    print()
    ListaSerbatoi.sort()
    stampa(ListaSerbatoi)
    print()
    stampa(mediana_capienze)
    
main()



ma cosi non va

Sbaglio qualcosa?

apatriarca
Dovrebbe essere
print(mediana_capienze(listaSerbatoi))

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.