| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  25-10-2008, 12:15 | #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_INTIo 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 ------------------------------------------------------------------------------------------------------------ | 
|   |   | 
|  25-10-2008, 13:28 | #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"  Chi scherza col fuoco si brucia. 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. | |
|   |   | 
|  25-10-2008, 14:06 | #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"  Chi scherza col fuoco si brucia. Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu | 
|   |   | 
|  25-10-2008, 23:43 | #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 rangeL'errore l'ho capito  ho provato a creare una lista di nr. random e non da errore..... 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 ------------------------------------------------------------------------------------------------------------ | 
|   |   | 
|  27-10-2008, 13:01 | #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 ------------------------------------------------------------------------------------------------------------ | 
|   |   | 
|  28-10-2008, 14:48 | #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"  Chi scherza col fuoco si brucia. Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu | |
|   |   | 
|  28-10-2008, 21:04 | #7 | |
| Senior Member Iscritto dal: Mar 2007 
					Messaggi: 4683
				 | Quote: 
  ho provato a creare una lista di nr. random e non da errore..... 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. | |
|   |   | 
|  28-10-2008, 22:11 | #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 ------------------------------------------------------------------------------------------------------------ | ||
|   |   | 
|  28-10-2008, 23:56 | #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. | |
|   |   | 
|  29-10-2008, 08:36 | #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 | 
|   |   | 
|  29-10-2008, 08:52 | #11 | |
| Senior Member Iscritto dal: Mar 2007 
					Messaggi: 4683
				 | Quote: 
 
				__________________ Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. | |
|   |   | 
|  29-10-2008, 10:39 | #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 | 
|   |   | 
|  29-10-2008, 13:05 | #13 | |
| Senior Member Iscritto dal: Mar 2007 
					Messaggi: 4683
				 | Quote: 
 
				__________________ Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. | |
|   |   | 
|  29-10-2008, 14:02 | #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 | 
|   |   | 
|  29-10-2008, 14:50 | #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. | |
|   |   | 
|  29-10-2008, 21:50 | #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 | ||
|   |   | 
|  30-10-2008, 01:36 | #17 | |
| Senior Member Iscritto dal: Mar 2007 
					Messaggi: 4683
				 | Quote: 
 
				__________________ Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. | |
|   |   | 
|  30-10-2008, 08:24 | #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 | 
|   |   | 
|  30-10-2008, 08:43 | #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: 15:04.









 
		 
		 
		 
		










 
  
 



 
                        
                        










