def vypocitaj_odlisnost(ovocie1, ovocie2):
    '''
    Vypočíta vzdialenosť dvoch ovocí
    :param ovocie1: hmotnosť a číslo farby ovocia
    :type ovocie1: list[float, float]
    :param ovocie2: hmotnosť a číslo farby ovocia
    :type ovocie2: list[float, float]
    :return: vzdialenosť dvoch ovoci
    :rtype: float
    '''
    rozdiel_hmotnost = ovocie1[0] - ovocie2[0]
    rozdiel_farba = ovocie1[1] - ovocie2[1]
    vzdialenost = (rozdiel_hmotnost ** 2 + rozdiel_farba ** 2) ** 0.5
    return vzdialenost

def urci_ovocie(data, nezname_ovocie, n):
    '''
    Metódou "k najbližších susedov (k-NN)" klasifikuje neznámy prvok
    :param data: dataset obsahujúci trojice typu [hmotnosť, číslo farby, druh ovocia]
    :type data: list[list[float, float, str]]
    :param nezname_ovocie: zoznam obsahujúci hmotnosť a farbu neznámeho ovocia
    :type nezname_ovocie: list[float, float]
    :param n: počet najbližších susedov potrebných na klasifikáciu neznámeho ovocia
    :type n: int
    :return: druh neznámeho ovocia
    :rtype: str
    '''
    odlisnosti = []
    for ovocie in data:
        odlisnost = vypocitaj_odlisnost(ovocie, nezname_ovocie)
        odlisnosti.append((odlisnost, ovocie[2]))
    odlisnosti.sort()
    # print(odlisnosti[:n])
    n_tica = [odlisnost[1] for odlisnost in odlisnosti[:n]]

    # najdenie najpocetnejsieho ovocia verzia 1
    naj_pocet = 0
    naj_ovocie = ''
    for ovocie in ['hruška', 'jablko', 'marhuľa', 'čerešňa', 'slivka']:
        aktualny_pocet = n_tica.count(ovocie)
        if aktualny_pocet > naj_pocet:
            naj_ovocie = ovocie
            naj_pocet = aktualny_pocet

    # najdenie najpocetnejsieho ovocia verzia 2
    pocty_ovoci = {}
    for ovocie in n_tica:
        pocty_ovoci[ovocie] = 1 + pocty_ovoci.get(ovocie, 0)
    naj_pocet = 0
    naj_ovocie = ''
    for ovocie, pocet in pocty_ovoci.items():
        if pocet > naj_pocet:
            naj_pocet = pocet
            naj_ovocie = ovocie

    # vratenie vysledku
    return naj_ovocie

data = [[8.88, 156.61, 'čerešňa'], [36.14, 203.27, 'slivka'], [169.86, 50.54, 'jablko'], [160.64, 164.88, 'jablko'], [36.38, 188.11, 'slivka'], [8.58, 162.6, 'čerešňa'], [50.9, 116.19, 'marhuľa'], [52.42, 108.99, 'marhuľa'], [190.05, 32.44, 'hruška'], [185.75, 46.17, 'hruška'], [181.29, 39.95, 'hruška'], [56.41, 106.53, 'marhuľa'], [35.82, 205.7, 'slivka'], [35.24, 204.6, 'slivka'], [182.95, 49.16, 'hruška'], [188.16, 37.62, 'hruška'], [161.36, 153.09, 'jablko'], [183.91, 35.95, 'hruška'], [58.48, 105.63, 'marhuľa'], [189.61, 41.3, 'hruška'], [9.43, 151.09, 'čerešňa'], [59.48, 103.34, 'marhuľa'], [183.03, 38.94, 'hruška'], [160.45, 167.78, 'jablko'], [58.7, 120.04, 'marhuľa'], [8.84, 167.76, 'čerešňa'], [155.41, 150.89, 'jablko'], [164.23, 166.08, 'jablko'], [168.43, 158.86, 'jablko'], [56.18, 125.02, 'marhuľa'], [34.2, 194.17, 'slivka'], [9.46, 163.98, 'čerešňa'], [168.15, 67.89, 'jablko'], [8.77, 164.07, 'čerešňa'], [8.72, 159.38, 'čerešňa'], [33.1, 188.09, 'slivka'], [52.68, 91.62, 'marhuľa'], [33.27, 186.31, 'slivka'], [36.18, 175.15, 'slivka'], [171.44, 150.84, 'jablko'], [35.08, 196.38, 'slivka'], [183.02, 43.53, 'hruška'], [8.63, 159.21, 'čerešňa'], [177.89, 38.08, 'hruška'], [35.27, 188.87, 'slivka'], [33.99, 193.97, 'slivka'], [54.27, 119.53, 'marhuľa'], [164.9, 61.71, 'jablko'], [36.63, 192.39, 'slivka'], [59.83, 119.48, 'marhuľa'], [164.19, 162.59, 'jablko'], [8.78, 172.6, 'čerešňa'], [55.19, 108.07, 'marhuľa'], [184.12, 42.19, 'hruška'], [179.8, 28.87, 'hruška'], [8.79, 155.02, 'čerešňa'], [186.55, 47.09, 'hruška'], [8.63, 156.99, 'čerešňa'], [32.6, 203.1, 'slivka'], [32.6, 178.78, 'slivka'], [9.02, 173.24, 'čerešňa'], [169.77, 48.58, 'jablko'], [163.98, 63.73, 'jablko'], [8.58, 156.62, 'čerešňa'], [8.89, 152.91, 'čerešňa'], [155.31, 54.76, 'jablko'], [168.23, 161.88, 'jablko'], [35.73, 192.01, 'slivka'], [154.95, 49.86, 'jablko'], [165.65, 154.61, 'jablko'], [9.25, 167.51, 'čerešňa'], [34.32, 172.28, 'slivka'], [52.25, 113.71, 'marhuľa'], [58.17, 120.36, 'marhuľa'], [34.46, 201.46, 'slivka'], [9.13, 176.29, 'čerešňa'], [59.34, 117.39, 'marhuľa'], [36.98, 184.54, 'slivka'], [33.63, 188.86, 'slivka'], [180.72, 41.69, 'hruška'], [168.66, 161.12, 'jablko'], [179.73, 47.74, 'hruška'], [34.73, 181.66, 'slivka'], [171.93, 30.89, 'jablko'], [35.08, 174.44, 'slivka'], [181.71, 44.78, 'hruška'], [33.38, 189.08, 'slivka'], [163.79, 153.08, 'jablko'], [32.33, 200.02, 'slivka'], [34.36, 186.43, 'slivka'], [164.97, 157.8, 'jablko'], [9.1, 166.39, 'čerešňa'], [56.0, 116.25, 'marhuľa'], [180.7, 32.76, 'hruška'], [166.0, 158.24, 'jablko'], [188.42, 37.75, 'hruška'], [164.23, 151.41, 'jablko'], [191.64, 35.85, 'hruška'], [35.2, 191.26, 'slivka'], [55.97, 91.95, 'marhuľa']]


print(urci_ovocie(data, [180, 49], 10))  # typická hruška
print(urci_ovocie(data, [172, 48], 10))  # veľké zelené jablko triedička rozpozná ako hrušku
print(urci_ovocie(data, [75, 120], 10))  # veľká marhuľa
print(urci_ovocie(data, [27, 177], 10))  # malá nezrelá slivka
print(urci_ovocie(data, [16, 172], 10))  # veľká prezretá čerešňa



