Riešenie 19. cvičenia


  1. Napríklad:

    import time
    import random
    
    def nahodne():
        n = int(input('zadaj n: '))
        start = time.time()
        zoznam = []
        for i in range(n):
            zoznam.append(random.randint(1, n))
        print('vyrob zoznam:', round(time.time()-start, 3))
        start = time.time()
        zoznam.sort()
        print('utried zoznam:', round(time.time()-start, 3))
    
    nahodne()
    

  1. Riešenie:

    def vyrob(n):
        zoz = list(range(10, 100))
        zoz = random.sample(zoz, n)
        return sorted(zoz)
    

    alebo

    def vyrob(n):
        return sorted(random.sample(range(10, 100), n))
    

  1. Riešenie:

    def hladaj(zoznam, hodnota):
        zac, kon = 0, len(zoznam)-1
        while zac <= kon:
            stred = (zac+kon) // 2
            for p in zoznam:
                print(p, end=' ')
            print()
            ret = ['  '] * len(zoznam)
            ret[zac], ret[kon], ret[stred] = ' z', ' k', ' s'
            for p in ret:
                print(p, end=' ')
            print()
            if zoznam[stred] < hodnota:
                zac = stred+1
            elif zoznam[stred] > hodnota:
                kon = stred-1
            else:
                return True
        return False
    
    hladaj(vyrob(20), 50)
    

  1. Riešenie:

    vyska = {'Igor': 197, 'Mariana': 160, 'Adam': 176, 'Tomáš': 180,
             'Daniela': 165, 'Sabína': 171, 'Martin': 191, 'Eva': 170,
             'Erik': 184, 'Anna': 166, }
    

  1. Riešenie:

    def vypis(slovnik):
        for kluc in sorted(slovnik):
            print(kluc, slovnik[kluc])
    

  1. Riešenie:

    def vypis(slovnik):
        zoz = []
        for kluc, hodnota in slovnik.items():
            zoz.append((hodnota, kluc))
        for hodnota, kluc in sorted(zoz):
            print(kluc, hodnota)
    

  1. Riešenie:

    def priemer(slovnik):
        return sum(slovnik.values()) / len(slovnik)
    

  1. Riešenie:

    def vypis2(slovnik):
        priemer = sum(slovnik.values()) / len(slovnik) # alebo priemer(slovnik)
        for kluc, hodnota in slovnik.items():
            if hodnota < priemer:
                text = 'pod'
            elif hodnota > priemer:
                text = 'nad'
            else:
                text = ''
            print(kluc, hodnota, text+'priemer')
    

  1. Riešenie:

    def len_od_do(slovnik, od, do):
        novy = {}
        for kluc, hodnota in slovnik.items():
            if od <= hodnota <= do:
                novy[kluc] = hodnota
        return novy
    

  1. Riešenie:

    def prevrat(slovnik):
        novy = {}
        for kluc, hodnota in slovnik.items():
            try:
                novy[hodnota].append(kluc)
            except KeyError:
                novy[hodnota] = [kluc]
        return novy
    

  1. Riešenie:

    import random
    
    def dve_kocky(n):
        f = {}
        for i in range(n):
            hod = random.randint(1, 6) + random.randint(1, 6)
            f[hod] = f.get(hod, 0) + 1
        return f
    

  1. Riešenie:

    def delitele(od, do):
        d = {}
        for n in range(od, do+1):
            zoz = []
            for i in range(1, n+1):
                if n%i == 0:
                    zoz.append(i)
            d[n] = zoz
        return d
    
    def len_deletele(slovnik, k):
        d = set()
        for n, zoz in slovnik.items():
            if len(zoz) == k:
                d.add(n)
        return d
    

  1. Riešenie:

    def pretypuj(nazov, hodnota):
        typ = {'int': int, 'float': float, 'list': list,
               'tuple': tuple, 'str': str, 'set': set}
        return typ[nazov](hodnota)
    

  1. Riešenie:

    def opakuju(meno_suboru):
        tab = {}
        with open(meno_suboru, encoding='utf-8') as text:
            for riadok in text:
                tab[riadok] = tab.get(riadok, 0) + 1
        for riadok, pocet in tab.items():
            if pocet >= 3:
                print(riadok, end='')
    

  1. Riešenie:

    def dvojice(meno_suboru):
        tab = {}
        with open(meno_suboru, encoding='utf-8') as text:
            for slovo in text.read().lower().split():
                for i in range(len(slovo)-1):
                    tab[slovo[i:i+2]] = tab.get(slovo[i:i+2], 0) + 1
        return tab
    

    alebo

    def dvojice(meno_suboru):
        tab = {}
        with open(meno_suboru, encoding='utf-8') as text:
            znak1 = ' '
            for znak2 in text.read().lower():
                if znak1 not in ' \n' and znak2 not in ' \n':
                    tab[znak1+znak2] = tab.get(znak1+znak2, 0) + 1
                znak1 = znak2
        return tab
    

  1. Riešenie:

    >>> vyska = {'Igor': 191, 'Mariana': 160, 'Adam': 171, 'Tomáš': 180,
                 'Daniela': 160, 'Sabína': 171, 'Martin': 191, 'Eva': 171,
                 'Erik': 180, 'Anna': 160, }
    >>> a = prevrat(vyska)
    >>> with open('subor.txt', 'w') as text:
            json.dump(a, text)
    >>> b = {"191": ["Igor", "Martin"], "160": ["Mariana", "Daniela", "Anna"],
             "171": ["Adam", "Sab\u00edna", "Eva"], "180": ["Tom\u00e1\u0161", "Erik"]}
    >>> a == b
    False
    

    Výsledok je False, lebo v JSON-súboroch sú kľuče asociatívnych polí vždy len reťazce.