|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
[Python] - Esercizio da principiante
Esercizio: scrivi una funzione chiamata Istogramma che prende una lista ed il numero di intervalli da considerare e ritorna l'istogramma della distribuzione dei valori per ciascun intervallo.
Codice:
def istogramma(Lista,N_INT):
L_INT = [0] * N_INT
for i in Lista:
Indice = int(i * N_INT)
L_INT[Indice] = L_INT[Indice] + 1
print L_INT
Io l'esercizio l'ho risolto così sta di fatto che non appena faccio partire la funzione mi da un'errore del genere: Codice:
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
istogramma()
File "C:\Documents and Settings\MICHELE\Desktop\Copia di Intervall_V2.py", line 7, in istogramma
L_INT[Indice] = L_INT[Indice] + 1
IndexError: list index out of range
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#2 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Più semplicemente, puoi dire al programma di leggere da Lista tanti elementi quanto è lunga Lista: Codice:
for i in range(len(Lista)):
Indice = Lista[i]
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 25-10-2008 alle 13:30. |
|
|
|
|
|
|
#3 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Allora, la cosa è in generale abbastanza complicata.
Se gli intervalli sono equispaziati, allora hai un insieme di valori compresi tra a incluso e b=a+N*h incluso, dove h è l'ampiezza dell'intervallo. Devi quindi trasformare l'intervallo [a,b) nell'intervallo [0,N) preservando l'ordine, e questo lo puoi fare mandando il valore x che leggi dalla lista, nel valore y = (x-a)/h. Allora i è la parte intera di y (il massimo intero che non supera y), ossia int(y). Se gli intervalli non sono equispaziati, allora devi trovare l'intervallo "buono" mediante una serie di confronti. Dovrebbe essere possibile farlo tramite una variante dell'algoritmo di ricerca binaria, che però adesso non ho voglia di cercare.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Io l'esercizio l'ho risolto così sta di fatto che non appena faccio partire la funzione mi da un'errore del genere:
Codice:
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
istogramma()
File "C:\Documents and Settings\MICHELE\Desktop\Copia di Intervall_V2.py", line 7, in istogramma
L_INT[Indice] = L_INT[Indice] + 1
IndexError: list index out of range
L'errore l'ho capito L'errore si crea ogni volta che usiamo numeri superiori allo 0.99 in quanto l'indice che viene generato esce dalla lista
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Un input per procedere??
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#6 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Dopodiché le cose da fare possono essere tante, a me viene in mente di creare la lista con un elemento in più dove segnare le istanze che causano un indice troppo grande.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
L'errore si crea ogni volta che usiamo numeri superiori allo 0.99 in quanto l'indice che viene generato esce dalla lista[/quote] Posta la lista di numeri random. Ogni volta che usi numeri superiori allo 0.99 dove? Comunque per essere un libro per principianti questo capitolo è abbastanza complesso, soprattutto per uno come me che la matematica nemmeno la toccava al liceo
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#8 | ||
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Quote:
Quote:
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
Il programma è questo: Codice:
def ListaCasuale (Lungh):
s = [0] * Lungh
for i in range(Lungh):
s[i] = random.random ()
return s
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Il problema è dovuto a questo int(i * N_INT) ovviamente.
Ora il punto è che i è un elemento della lista, e se N_INT rappresenta il numero di elementi della lista, mi pare normale che se i >= 1.0 ti tenterà di accedere a un elemento fuori dalla lista. Bisogna assicurarsi che i sia sempre < 1.0, e questo la funzione random.random lo garantisce.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Molto semplice. Supponiamo che tu abbia 8 elementi nella lista, e ci sia un elemento pari a 1.0.
int(1.0 * 8) = 8 quindi dovrei accedere all'elemento di indice 8. Ma in una lista gli elementi partono da 0, per cui gli indici variano sempre da 0 a 7. Se provi ad accedere a quello di indice 8 sollevi un'eccezione, appunto.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
"i" è semplicemente l'elemento della lista, per cui dipende strettamente da come è stato generato. Se con random.random, allora è garantito essere < 1.0, per cui problemi non dovrebbe darli (posto che N_INT sia effettivamente il numero di elementi della lista).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
P.S: che significa posto che N_INT sia effettivamente il numero di elementi della lista? Se come valore metto 8 sono sicuro che gli elementi sono quelli. O sbaglio?
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
"i" non attraversa la lista: è un suo elemento.
Quote:
Codice:
Lista = [random.random() for i in range(8)] Quote:
Oppure se hai passato len(Lista) come N_INT.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Certamente.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Ok. Comunque anche se hai detto che posso andare avanti appena finisco l'altro esercizio dei numeri casuali provo a ragionare su questo codice dell'istogramma
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:15.




















