n° 219
Novembre 2017
Dicembre 12, 2017, 08:40:09 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Python errore con while  (Letto 3159 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Trip
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo E-mail
« inserita:: Febbraio 10, 2016, 12:50:17 »

Salve atutti,
da qualche settimana mi sto addentrando nel mondo di python 3.5.
Durante il mio percorso didattico sono incappato in una  funzione che restituisce un vincitore data in ingresso un file "Partite3.csv"contenente i risultati di una serie di partite di dadi.Tale file ha il seguente formato:

Paolo,Mario,Carlo
2,2,5
2,12,5
2,3,9
7,10,8
2,9,12

mentre la funzione sopracitate è:
Codice:
def vincitore(file_in):
    fin=open(file_in,"r",encoding="UTF-8")
    nomi=fin.readline().strip().split(",") #consuma  prima riga (nomi)e la mette in una lista
    #print(nomi)
    vincite=[]
    for i in range(len(nomi)):
        vincite.append(0) #[0,0,0]
    print(vincite)   
    riga=fin.readline().strip().split(",")    #legge la seconda riga (dati)
    #print(riga)
    while len(riga[0]) >0:
        for i in range(len(riga)):
            riga[i]=int(riga[i])    #riga ora è una lista di interi
        if riga[i]==max(riga):
                    vincite[i]+=1
        #print(vincite)       
        riga=fin.readline().strip().split(",")
    fin.close()
    vincitori=""
    for i in range(len(nomi)):
        if vincite[i]==max(vincite):
            vincitori=vincitori+nomi[i]+ " "
    return vincitori
           

#restituisce il nome del gicatore che ha vinto più partite,
   #numero partite vinte

print(vincitore("Partite3.csv"))

il mio problema è il seguente:
se sostituisco la condizione del while affinchè non venga più controllata la presenza di una riga dati mediante la sua lunghezza maggione di 0 ma bensi il suo valore maggiore di 0 (quindi"while (riga[0]) >0:
")mi esce il seguente errore:
Citazione
Traceback (most recent call last):
  File "C:\Users\Claudio\Desktop\01_vincitore.py", line 29, in <module>
    print(vincitore("Partite3.csv"))
  File "C:\Users\Claudio\Desktop\01_vincitore.py", line 11, in vincitore
    while (riga[0]) >0:
TypeError: unorderable types: str() > int()
qualcuno sa spiegarmi il perchè.
un grazie anticipatamente a chi mi vorra aiutare
ciao
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #1 inserita:: Febbraio 10, 2016, 03:42:02 »

È lo stesso che avresti riportando, in modalità interattiva,:

Codice:
'30' > 31

In Python 3 da l'errore che ti è noto  Ghigno in Python 2 era (ed è) accettato. È sufficiente fare una banale verifica in modalità interattiva.

Altrimenti detto, in Python3 una stringa e un valore non sono ordinabili. Nel tuo caso la stringa deriva dalla linea 11:

Citazione
while len(riga[0]) >0:

dove, presumo (gli ho dato solo una veloce occhiata) vai a confrontare un nome proprio di persona (quindi una stringa) con un numero intero.
Registrato
Trip
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo E-mail
« Risposta #2 inserita:: Febbraio 10, 2016, 04:02:22 »

È lo stesso che avresti riportando, in modalità interattiva,:

Codice:
'30' > 31

In Python 3 da l'errore che ti è noto  Ghigno in Python 2 era (ed è) accettato. È sufficiente fare una banale verifica in modalità interattiva.

Altrimenti detto, in Python3 una stringa e un valore non sono ordinabili. Nel tuo caso la stringa deriva dalla linea 11:

Citazione
while len(riga[0]) >0:

dove, presumo (gli ho dato solo una veloce occhiata) vai a confrontare un nome proprio di persona (quindi una stringa) con un numero intero.
ciao, grazie per la celere risposta.
per quanto riguarda il confronto tra  un' intero (0) euna stringa (riga[0]) e  provato a 'trasformare' quest'ultimo in un'intero (  riga[0])= int(riga
  • )   )   ma niente da fare.Mi da sempre lo stesso errore.

e poi cosa centra lA chiamata alla funzione...
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +50/-1
Scollegato Scollegato

Messaggi: 2102



Mostra profilo WWW
« Risposta #3 inserita:: Febbraio 10, 2016, 04:04:24 »

E' normale: quando avviene quel controllo, riga è un vettore di stringhe (ad esempio: ['1','2','3']). Non puoi controllare se una stringa è maggiore di 0, non ha senso. Forse intendi int(riga[0]) > 0?

Ad ogni modo, bada che quel len(riga[0]) viene usato per vedere se il vettore è [""], che è ciò che ottieni quando il file termina, e viene eseguito un readline che restituisce una stringa vuota. "".strip().split(','), infatti, restituisce [""]. (puoi in effetti sostituire quel controllo con il più semplice: while riga != [""]:).

Ad ogni modo, se posso permettermi, anche il codice originale è scritto in modo un po' convoluto e poco "pythonico". Un modo più semplice per riscrivere quell'orrendo while usando correttamente l'oggetto file come un generatore:

Codice:
   for riga in fin:
        riga = riga.strip().split(',')
    
        for i in range(len(riga)):
            riga[i]=int(riga[i])    #riga ora è una lista di interi

        for i in range(len(riga)):
            if riga[i] == max(riga):
                vincite[i] += 1      

Nota anche che nel codice ho corretto un gravissimo errore (mancava un'istruzione for!), che faceva sballare completamente il computo dei vincitori.

Ci sarebbero comunque molti altri appunti di stile da evidenziare riguardo al codice originale che hai postato - che al di là del veloce restauro fatto qui, potrebbe essere facilmente riscritto in una manciata di righe.

---

Nota: Vedo ora che michele.p aveva già risposto nel frattempo, peraltro correttamente :p.
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
Trip
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo E-mail
« Risposta #4 inserita:: Febbraio 10, 2016, 06:02:17 »

E' normale: quando avviene quel controllo, riga è un vettore di stringhe (ad esempio: ['1','2','3']). Non puoi controllare se una stringa è maggiore di 0, non ha senso. Forse intendi int(riga[0]) > 0?

grazie per la risposta...
si ho provato anche a trasformare in intero il contenuto in posizione 0 della ziga ( int(riga[0]) > 0) ma mi da comunque l'errore e non capisco il perchè? Pianto
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +50/-1
Scollegato Scollegato

Messaggi: 2102



Mostra profilo WWW
« Risposta #5 inserita:: Febbraio 10, 2016, 06:14:59 »

Molto probabilmente perché nell'ultima iterazione tenti di eseguire un int("").

Prova a postare il codice che hai scritto, comunque.
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
Trip
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo E-mail
« Risposta #6 inserita:: Febbraio 11, 2016, 12:08:44 »

Codice:
[quote author=Roberto Allegra link=topic=26311.msg95548#msg95548 date=1455120899]
Molto probabilmente perché nell'ultima iterazione tenti di eseguire un int("").

Prova a postare il codice che hai scritto, comunque.

[/quote]
def vincitore(file_in):
    fin=open(file_in,"r",encoding="UTF-8")
    nomi=fin.readline().strip().split(",") #consuma  prima riga (nomi)e la mette in una lista
    #print(nomi)
    vincite=[]
    for i in range(len(nomi)):
        vincite.append(0) #[0,0,0]
    riga=fin.readline().strip().split(",")    #legge la seconda riga (dati)
    #print(riga)
    while int((riga[0])) >0:
        for i in range(len(riga)):
            riga[i]=int(riga[i])    #riga ora è una lista di interi
        if riga[i]==max(riga):
             vincite[i]+=1
        #print(vincite)       
        riga=fin.readline().strip().split(",")
    fin.close()
    vincitori=""
    for i in range(len(nomi)):
        if vincite[i]==max(vincite):
            vincitori=vincitori+nomi[i]+ " "
    return vincitori
           

#restituisce il nome del gicatore che ha vinto più partite,
   #numero partite vinte

print(vincitore("Partite3.csv")

visto che ci siamo...
...che differenza c'è tra : int() e int("")? danno due risultati diversi:il primo da come risultato 0 mentre l'ultimo da errore.
Registrato
michele.p
Administrator
Full Member
*****

Karma: +9/-2
Scollegato Scollegato

Messaggi: 586


Mostra profilo
« Risposta #7 inserita:: Febbraio 11, 2016, 07:49:44 »

Mi sembra di capire che tu vuoi verificare se una data stringa (mi sembra un nome di persona) sia effettivamente presente o meno quindi se c'è una stringa con un certo numero di caratteri. Se così, puoi optare per una cosa del genere (è solo un esempio banale!):

Codice:
stringa = "Io sono una stringa di caretteri"
print ("Lunghezza della stringa: ", len(stringa))

ovvero fare la verifica su "len(stringa)".
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines