Infinite cicle in python

Viewed 52

I have a problem with this code that genereats an infinite loop.

I have a collection of data in a list named dati.

I want to print this data without print items that have the same "numerocorso" that is the value in index=0 (risultato[0])

My idea was this:

  1. Check the lenght of "corsiTrovati" list, if this lenght is equal to 0 that's means that I don't have already print any result so i print the result item and append the risultato[0] in corsiTrovati.

  2. If the length of this list is not equal to 0 that means that i have have elements in "corsiTrovati" so , for any element in this list, **I compare if the current element of this list is equal to the current value extract from "dati".

  • If is equal I pass because I don't want to print an element already printed.

  • If is not true it prints the result and append the actual risultato[0] in the "corsiTrovati"` list.

I don't understand what i do wrong. Here's the code snippet:

for risultato in dati:
            if len(corsiTrovati)==0:
                print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
                corsoAttuale = str(risultato[0])
                corsiTrovati.append(corsoAttuale)
            else:
                for corso in corsiTrovati:
                    if corso==risultato[0]:
                        pass
                    else:
                        print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
                        corsoAttuale = str(risultato[0])
                        corsiTrovati.append(corsoAttuale)

Edit: complete code:

import csv

with open("./data.csv", newline="") as fileDati:
    csvHandler = csv.reader(fileDati,delimiter=",")

    numeroDocenti = int(input("Inserisci il numero di docenti da ricercare: "))
    listaDocenti = []
    corsiTrovati = []
    corsoAttuale = ""
    
    while len(listaDocenti) < numeroDocenti:
        docenteAttuale = input("Inserisci docente [Name Surname]: ")
        listaDocenti.append(docenteAttuale)

    filtroAnnoSolare = input("Desideri filtrare per anno Solare? [Y/N]: ")

    if filtroAnnoSolare=="Y":
        annoSolare = input("Inserisci anno solare: ")
    else:
        pass

    filtroAnnoCorso = input("Desideri filtrare per anno di corso? [Y/N]: ")

    if filtroAnnoCorso=="Y":
        annoCorso = input("Inserisci anno di corso da ricercare: ")
    else:
        pass

    for docente in listaDocenti:
        print(f"Corsi del docente {docente}: ")
        if filtroAnnoSolare=="N" and filtroAnnoCorso=="N":
            dati = [(riga[1],riga[3],riga[0]) for riga in csvHandler if docente in riga[4]]            
            for risultato in dati:
                if len(corsiTrovati)==0:
                    print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
                    corsoAttuale = str(risultato[0])
                    corsiTrovati.append(corsoAttuale)
                else:
                    for corso in corsiTrovati:
                        if corso==risultato[0]:
                            pass
                        else:
                            print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
                            corsoAttuale = str(risultato[0])
                            corsiTrovati.append(corsoAttuale) 
2 Answers

I think you need to disclose a bit more details about your variables, like what is dati? where did you declare corsiTrovati?

Anyway a working code under my assumptions (the first 2 lines) is:

corsiTrovati = []
dati = [... list of risultati ...]

for risultato in dati:
    corsoAttuale = str(risultato[0])
    if corsoAttuale not in corsiTrovati:
        print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
        corsiTrovati.append(corsoAttuale)

Is difficult to understand because can't see the whole code.

Having sayd that, it looks like you go in a infinite loop because you are appending to the list and then looping in it? So running a in keyword without looping instead

for risultato in dati:
                corsoAttuale = str(risultato[0])
                if not len(corsiTrovati):
                    print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
                    corsiTrovati.append(corsoAttuale)
                else:  # There are item in list so we check deeper                    
                    if corso in corsoAttuale:
                        pass
                    else:
                        corsiTrovati.append(corsoAttuale)
                        print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")

Additionally, you may wanna use a temporary set to gather the results and check as a set can have unique elements:

results = set()

for risultato in dati:
                corsoAttuale = str(risultato[0])
                results.add(corsoAttuale)
                if not len(corsiTrovati):
                    print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
                    corsiTrovati.append(corsoAttuale)
                else:  # There are item in list so we check deeper
                    if corso in results:
                        pass
                    else:
                        corsiTrovati.append(corsoAttuale)
                        print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")

results = set()

EDIT try this

import csv

with open("./data.csv", newline="") as fileDati:
    csvHandler = csv.reader(fileDati, delimiter=",")

    numero_docenti = int(input("Inserisci il numero di docenti da ricercare: "))
    lista_docenti = []
    corsi_trovati = []
    corso_attuale = ""

    while len(lista_docenti) <= numero_docenti:
        docente_attuale = input("Inserisci docente [Name Surname]: ")
        lista_docenti.append(docente_attuale)

    filtro_anno_solare = input("Desideri filtrare per anno Solare? [Y/N]: ")

    if filtro_anno_solare.lower() == "Y":
        anno_solare = input("Inserisci anno solare: ")
    else:
        anno_solare = 'N'

    filtro_anno_corso = input("Desideri filtrare per anno di corso? [Y/N]: ")

    if filtro_anno_corso.lower() == "Y":
        anno_corso = input("Inserisci anno di corso da ricercare: ")
    else:
        filtro_anno_corso = 'N'

    for docente in lista_docenti:
        print(f"Corsi del docente {docente}: ")
        if anno_solare == "N" and filtro_anno_corso == "N":
            dati = [(riga[1], riga[3], riga[0]) for riga in csvHandler if docente in riga[4]]
            
            temp_num_corse = set()
            for risultato in dati:
                corso_attuale = risultato[0]  # Move it here, more clean 
                if not len(corsi_trovati):  # IF len == 0 then if False and will not run, more clean 
                    print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")                    
                    corsi_trovati.append(str(corso_attuale))
                    temp_num_corse.add(corso_attuale)
                else:
                    if risultato[0] in temp_num_corse:
                        pass                    
                    else:
                        print(f"Numero corso: {risultato[0]} -- Nome corso: {risultato[1]} -- Istituto: {risultato[2]}")
                        corsi_trovati.append(corso_attuale)
                        temp_num_corse.add(corso_attuale)

Considerations

  1. I how the variables were named, I couldn't resist, Python as convention use camel case for variable like this -> camel_case and not like this -> camelCasePep 8

  2. I changed the while loop from while len(lista_docenti) < numero_docenti: to while len(lista_docenti) <= numero_docenti: maybe was this making the infinite loop?

  3. I add a temp_num_corse as set, and i added as int, so it hold a unique element check this on paragraph "Duplicates Not Allowed"

Related