Skocz do zawartości

Problem z wybieraniem najlepszej osoby program PYTHON 3


Zakrzewiaczek

Pomocna odpowiedź

Dzień dobry,

do szkoły tworze program, który zapisuje imię i nazwisko osoby biorącej udział w imprezie sportowej oraz zapisuje jej wyniki. Natomiast mam problem z funkcją (klasa wynik funkcja pokaz_wyniki), która odpowiedzialna jest za wybieranie najlepszych osób. Program zapisuje w tablicy ilosc_najlepszych_wynikow ilość wyników, w których dany zawodnik jest najlepszy. Każda komórka przechowuje tę ilość dla każdego osoby. Natomiast dalej jest problem polegający na tym, że kiedy mamy powyżej 2 osób biorących udział, program poprawnie pokazuje najlepszą osobę, natomiast 2 i 3 miejsce jest pokazywane błędnie. Program jest napisany w języku Python 3.11. Poniżej podaję kod. Dziękuję za pomoc.

osoby = list()
wyniki = list() #skoki przez płotki, siatkówka, tenis ziemny, tenis stołowy, rugby
ilosc_najlepszych_wynikow = list()
nazwy = ["Skoki przez płotki (w s)", "Siatkówka (wygrane sety)", "Tenis ziemny (wygrane sety)", "Tenis stołowy (wygrane sety)", "Rugby (punkty)"]

class osoba():
    def dodaj(): 
        print("Podaj nazwe osoby: ")
        osoby.append(input())
        for i in range(5):
            print(nazwy[i])
            wyniki.append(int(input()))
        print("Dodano pomyślnie")
        
    def wyczysc():
        osoby.clear()
        wyniki.clear()
        print("Wyczyszczono pomyslnie")

    def pokaz_liste():
        poz = 0
        if(len(osoby) != 0):
            print("imię i nazwisko | ", end="")
            for i in range(4):
                print(nazwy[i], end=" | ")
            print(nazwy[4], end="\n\n")
            
            for i in range(len(osoby)):
                print(osoby[i], end=" | ")
                for a in range(4):
                    print(wyniki[i*5+a], end=" | ")
                print(wyniki[i*5+4])

            print("\n\nTo już wszystko...\n")
        else: print("Brak")

class wynik():
    def pokaz_wyniki():

        ilosc_najlepszych_wynikow.clear()
        for i in range(len(osoby)):
            ilosc_najlepszych_wynikow.append(0)
        
        najlepsze_wyniki = list()
        wartosci = list()

        for a in range(5):
            wartosci.clear()
            
            for i in range(len(osoby)):
                wartosci.append(wyniki[(i*5) + a])
            if(a != 0):    
                najlepsze_wyniki.append(max(wartosci))
            else:
                najlepsze_wyniki.append(min(wartosci))
        
        for a in range(5):
            for i in range(len(osoby)):
                if(najlepsze_wyniki[a] == wyniki[i*5+a]):
                    ilosc_najlepszych_wynikow[i] += 1

        if(len(osoby) > 3):
            a = 3
        elif(len(osoby) > 0):
            a = len(osoby)
        else:
            print("Brak osob")
            a = -1
            
        osoby_sort = list()

        #od tego miejsca program działa niepoprawnie
        
        for i in range(a):
            osoby_sort.append(osoby[ilosc_najlepszych_wynikow.index(max(ilosc_najlepszych_wynikow))])
            del ilosc_najlepszych_wynikow[ilosc_najlepszych_wynikow.index(max(ilosc_najlepszych_wynikow))]

        for i in osoby_sort:
            print(osoby_sort, end=" | ")
        

 

Link do komentarza
Share on other sites

Po pierwsze: w Ptrhonie nie ma tablic, są listy i krotki, a to zupełnie coś innego.

Po drugie: dla list istnieje metoda sort() - poczytaj o jej parametrach, szczególnie o funkcji jako parametr.

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@ethanak lista i Tablica to to samo, dzięki za pomysł, spróbuję go wsadzić. Zresztą krótka tu by była bez sensu, gdyż w razie pomyłki trzeba by było usuwać zawartość i jeszcze raz ją dodawać. 

Link do komentarza
Share on other sites

2 godziny temu, Zakrzewiaczek napisał:

lista i Tablica to to samo

Nie!!! Za takie stwierdzenie u mnie dostałbyś pałę.

A jako że stopnia nie mogę wystawić, proponuję za karę dowiedzieć się czym się różni lista od tablicy 🙂

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

A nie możesz przechowywać danych w ten sposób?

wyniki={'gracz1': 14, 'gracz2': 45, 'gracz3': 1}

Potem tylko posortować

sorted(wyniki.items(), key=lambda x:x[1], reverse=True)

I

 

  • Lubię! 1
Link do komentarza
Share on other sites

@ethanak jednak nie jest to samo 5ak jak mówiłeś 😉. Zgodnie z waszymi radami dałem sortowanie z Reverse na True, i udało się! Dziękuję za pomoc. Zmieniony kod wygląda tak: 

ilosc_najlepszych wynikow_sort= list()
ilosc_najlepszych wynikow_sort = ilosc_najlepszych wynikow.copy()
11osc_najlepszych wynikow_sort.sort (reverse=True)
for i in range (len (osoby)):
print (1+1, "miejsce:", osoby [ilosc_najlepszych wynikow.index (ilosc_najlepszych wynikow_sort[i])])

 

Link do komentarza
Share on other sites

Zamiast copy + sort możesz po prostu użyć funkcji sorted, która tworzy posortowaną kopię listy. Coś w stylu:

ilosc_najlepszych wynikow_sort = sorted(ilosc_najlepszych wynikow, reverse=True)

Poza tym ja bym po prostu posortował listę osoby, coś w stylu:

osoby_sort = sorted(osoby, key=???)

W miejsce "???" podstaw sobie jakąś fajną funkcję 🙂

 

 

Edytowano przez ethanak
  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.