PDA

View Full Version : [Python] - Esercizio da principiante


88MIKI88
25-10-2008, 12:15
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.


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:

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

Ziosilvio
25-10-2008, 13:28
for i in Lista:
Indice = int(i * N_INT)
L_INT[Indice] = L_INT[Indice] + 1
Lista può essere una lista di qualsiasi cosa, quindi non sai bene quale valore assumerà int(i * N_INT).
Più semplicemente, puoi dire al programma di leggere da Lista tanti elementi quanto è lunga Lista:
for i in range(len(Lista)):
Indice = Lista[i]
EDIT: ah, no, aspetta, i valori sono in intervalli... aspetta che ci penso...

Ziosilvio
25-10-2008, 14:06
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.

88MIKI88
25-10-2008, 23:43
Io l'esercizio l'ho risolto così sta di fatto che non appena faccio partire la funzione mi da un'errore del genere:

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
[/QUOTE]

L'errore l'ho capito :muro: 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

88MIKI88
27-10-2008, 13:01
Un input per procedere??

Ziosilvio
28-10-2008, 14:48
L'errore si crea ogni volta che usiamo numeri superiori allo 0.99 in quanto l'indice che viene generato esce dalla lista
Allora bisogna sicuramente imporre un controllo per assicurarsi che l'indice calcolato sia sensato.
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.

~FullSyst3m~
28-10-2008, 21:04
Io l'esercizio l'ho risolto così sta di fatto che non appena faccio partire la funzione mi da un'errore del genere:

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 :muro: 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

88MIKI88
28-10-2008, 22:11
L'errore l'ho capito :muro: 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

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

Prendi il programma che genera numeri casuali e tira fuori una lista di numeri.....se tu prendi valori dall'1 in su viene dato errore

~FullSyst3m~
28-10-2008, 23:56
Prendi il programma che genera numeri casuali e tira fuori una lista di numeri.....se tu prendi valori dall'1 in su viene dato errore

In che senso se prendi valori dall'1 in su?

Il programma è questo:


def ListaCasuale (Lungh):
s = [0] * Lungh
for i in range(Lungh):
s[i] = random.random ()
return s

cdimauro
29-10-2008, 08:36
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.

~FullSyst3m~
29-10-2008, 08:52
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.

Ma perchè questo limite dell'1.0? Cioè, se io ho i e lo moltiplico ciclicamente ad 8 ad esempio, perchè dovrebbe accedere ad un elemento fuori dalla lista? Dove è imposto il limite di 1.0?

cdimauro
29-10-2008, 10:39
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.

~FullSyst3m~
29-10-2008, 13:05
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.

A questo c'ero arrivato pure io, infatti l'ho pure scritto nell'altro topic mi sembra. Quello che non mi è chiaro è quell'i, cioè il valore di i attraversa tutta la lunghezza, per non fare uscire l'indice fuori dal limite allora i dovrebbe attraversare la lista di numeri casuali generata con random.random. O no?

cdimauro
29-10-2008, 14:02
"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).

~FullSyst3m~
29-10-2008, 14:50
"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).

Bè se i attraversa la Lista si sa come è generato. Per generarlo con random.random si dovrebbe scrivere una cosa del tipo = i = random.random ()?

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?

cdimauro
29-10-2008, 21:50
Bè se i attraversa la Lista si sa come è generato.
"i" non attraversa la lista: è un suo elemento.
Per generarlo con random.random si dovrebbe scrivere una cosa del tipo = i = random.random ()?
Per generare una lista di 8 numeri random io farei così:
Lista = [random.random() for i in range(8)]
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?
Sei sicuro se e solo se hai generato una lista di 8 elementi.

Oppure se hai passato len(Lista) come N_INT. ;)

~FullSyst3m~
30-10-2008, 01:36
"i" non attraversa la lista: è un suo elemento.

Per generare una lista di 8 numeri random io farei così:
Lista = [random.random() for i in range(8)]

Sei sicuro se e solo se hai generato una lista di 8 elementi.

Oppure se hai passato len(Lista) come N_INT. ;)

Si scusa, volevo dire che è un suo elemento che cambia ad ogni ciclo. Se genero una lista di 8 numeri casuali come hai scritto tu dovrei essere abbastanza sicuro non credi?

cdimauro
30-10-2008, 08:24
Certamente.

~FullSyst3m~
30-10-2008, 08:43
Certamente.

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