#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Fri Oct 30 11:14:22 2020 @author: andrea """ ''' istogramma di una serie di dati Input: - lista di dati numerici (interi/float?) - definizione degli intervalli (implicita/esplicita?) Output: - stringa con più righe, una per ogni valore ciascuna riga contiene il valore, spazio e tanti asterischi quante volte quel valore appare nei dati (i valori con conteggio 0 devono apparire?) # per ottenere l'istogramma conoscendo A,B e i dati # calcolo le frequenze dei dati # opzione uno: usiamo una lista se: # i valori sono interi # conosciamo l'intervallo di valori possibili [A, B] # dalle frequenze produco la stringa ''' def istogramma_con_estremi_e_dati_interi(A, B, dati): # calcoliamo la lista dei conteggi istogramma = calcola_frequenze(A,B, dati) # produciamo la stringa return produci_istogramma(A, istogramma) # per produrre l'istogramma da A a B con dati solo interi tra A e B def calcola_frequenze(A, B, dati): # costruisco una lista di B-A+1 elementi = 0 istogramma = [0] * (B-A+1) # per ogni valore X dei dati for X in dati: # l'indice corretto è I=X-A # incrementiamo l'elemento nella posizione I istogramma[X-A] += 1 # torno la lista return istogramma # per produrre la string dell'istogramma def produci_istogramma(A, istogramma): # inizializziamo il risultato con '' risultato = '' # per ogni indice X della lista for X, N in enumerate(istogramma): # il valore originale nei dati è A+X valore = X+A # la frequenza N di quel dato è nella posizione della lista # aggiungo al risultato la stringa # {valore} N asterischi risultato += str(valore) + '\t' + ('*' * N) + '\n' # torno il risultato return risultato def istogramma_con_estremi_e_dati_float(A, B, dati): # calcoliamo la lista dei conteggi istogramma = calcola_frequenze_float(A,B, dati) # produciamo la stringa return produci_istogramma(A, istogramma) # per produrre l'istogramma da A a B con dati anche float tra A e B def calcola_frequenze_float(A, B, dati): # costruisco una lista di B-A+1 elementi = 0 istogramma = [0] * (B-A+1) # per ogni valore X dei dati for X in dati: # trasformo il dato X in intero X = int(X) # l'indice corretto è I=X-A # incrementiamo l'elemento nella posizione I istogramma[X-A] += 1 # torno la lista return istogramma # per calcolare l'istogramma dei dati con un dizionario def calcola_frequenze_con_diz_int(dati): # inizializzo il dizionario a {} istogramma = {} # key = valore visto nei dati # value = frequenza di apparizione del dato # per ogni dato X for X in dati: # calcolo la chiave # se la chiave non appare nel dizionario if X not in istogramma: # gli associo il valore 1 istogramma[X] = 1 # altrimenti else: # aggiungo 1 al valore corrente istogramma[X] += 1 # ritorno il dizionario return istogramma # per produrre la stringa da un istogramma dizionario def produci_istogramma_diz_con_buchi(istogramma): # inizializzo il risultato come '' risultato = '' # per ogni coppia chiave:valore dell'istogramma for valore, frequenza in sorted(istogramma.items()): # aggiungo la riga chiave\ttanti asterischi\n risultato += str(valore) + '\t' + '*'*frequenza + '\n' # ritorno la stringa return risultato # per produrre la stringa da un istogramma dizionario def produci_istogramma_diz_senza_buchi(istogramma): # inizializzo il risultato come '' risultato = '' # cerco minimo e massimo delle chiavi minimo = min(istogramma.keys()) massimo = max(istogramma.keys()) # genero tutti valori tra minimo e massimo # per ciascun valore tra minimo e massimo for valore in range(minimo, massimo+1): # aggiungo la riga chiave\ttanti asterischi\n if valore in istogramma: frequenza = istogramma[valore] else: frequenza = 0 risultato += str(valore) + '\t' + '*'*frequenza + '\n' # ritorno la stringa return risultato def istogramma_con_diz_e_dati_int(dati): # calcoliamo la lista dei conteggi istogramma = calcola_frequenze_con_diz_int(dati) # produciamo la stringa return produci_istogramma_diz_con_buchi(istogramma) def istogramma_con_diz_e_dati_int_nh(dati): # calcoliamo la lista dei conteggi istogramma = calcola_frequenze_con_diz_int(dati) # produciamo la stringa return produci_istogramma_diz_senza_buchi(istogramma) if __name__ == '__main__': #print(istogramma_con_estremi_e_dati_float(5, 10, [ 6.3, 6.56, 5.1, 9.44, 10.0, 10.99, 7.1, 7.999999, 9.2])) import random valori = random.choices(range(-17, 11), k=100) #print(istogramma_con_estremi_e_dati_interi(-17, 10, valori)) print(istogramma_con_diz_e_dati_int(valori)) print(istogramma_con_diz_e_dati_int_nh(valori))