# Průběžný test C2184 Úvod do programování v Pythonu, podzim 2018 # # Vzorové riešenia pre všetky varianty zadania. Číslovanie funkcií nezodpovedá pôvodnému číslovaniu. # Napište definici ​funkce1​, která na terminál vypíše obsah parametru seznam​ takto: # Pořadí Hodnota # 0 1.000 # 1 658.422 # 2 1.0e+03 # 3 9.5e-04 # 4 3.7e+06 # První sloupeček má velikost přesně 6 znaků a druhý 7 znaků. Mezi sloupečky je mezera. # Pokud je hodnota menší než 0.001 nebo větší nebo rovno 1000, použijte vědecký formát s jedním desetinným místem, # jinak použijte standardní formát pro číslo s 3 desetinnými místy. def funkce1(seznam: list) -> None: """ >>> funkce1([1, 6.5842152E2, 1000.1, 0.00095, 3683403.42]) Pořadí Hodnota 0 1.000 1 658.422 2 1.0e+03 3 9.5e-04 4 3.7e+06 """ # Vzorové riešenie: print('Pořadí Hodnota') for i, value in enumerate(seznam): if value < 0.001 or value >= 1000: print(f'{i:<6d} {value:7.1e}') else: print(f'{i:<6d} {value:7.3f}') # U rôznych skupín sa trochu líšil formát výpisu a hranice, od ktorých treba použiť vedecký formát. # Napište definici ​funkce2​, která přijímá parametr ​retezec ​a​ vrátí jako návratovou hodnotu ​retezec​, # který bude vždy začínat a končit právě jedním podtržítkem ​_.​ def funkce2(retezec: str) -> str: """ >>> funkce2("abc") '_abc_' >>> funkce2("_def") '_def_' >>> funkce2("__ghi") '_ghi_' >>> funkce2("jkl_") '_jkl_' >>> funkce2("mno__") '_mno_' >>> funkce2("p__qr") '_p__qr_' >>> funkce2("") '__' """ # Vzorové riešenie: return '_' + retezec.strip('_') + '_' # Alternatívne riešenie, bez použitia funkcie strip: while retezec.startswith('_'): retezec = retezec[1:] while retezec.endswith('_'): retezec = retezec[:-1] return '_' + retezec + '_' # Napište definici ​funkce3, která přijímá parametr ​retezec ​a ​vrátí jako návratovou hodnotu # a. stejný ​retezec​, pokud tento ​retezec začíná a končí stejným znakem # b. "$" a ​retezec​ , pokud tento retezec ​ nezačíná a nekončí stejným znakem def funkce3(retezec: str) -> str: """ >>> funkce3("aba") 'aba' >>> funkce3("000") '000' >>> funkce3("a12") '$a12' """ if retezec[0] == retezec[-1]: return retezec else: return '$' + retezec # Napište definici ​funkce4, která vrátí jako návratovou hodnotu funkce invertovaný slovník získaný jako parametr funkce. # V tomto příkladu je to myšleno tak, že přehodíte klíče za hodnoty a naopak. # Předpokladejme, že hodnoty v tomto slovníku jsou unikátní. {"a": "b"} -> {"b": "a"} def funkce4(slovnik: dict) -> dict: """ >>> funkce4({"a": "b"}) {'b': 'a'} >>> funkce4({"zelená": "green", "modrá": "blue", "žlutá": "yellow"}) {'green': 'zelená', 'blue': 'modrá', 'yellow': 'žlutá'} """ # Vzorové riešenie: return {value: key for key, value in slovnik.items()} # Alternatívne riešenie, bez použitia generator expression: result = {} for key, value in slovnik.items(): result[value] = key return result # Napište definici ​funkce5, která vrátí jako návratovou hodnotu funkce slovník # poskládaný ze dvou listu: ​klice, hodnoty ​získané jako parametry funkce. # Předpokladejme, že ​klice​jsou unikátní. def funkce5(klice: tuple, hodnoty: tuple) -> dict: """ >>> funkce5(("a", "b", "c"), (1, 2, 3)) {'a': 1, 'b': 2, 'c': 3} >>> funkce5(("zelená", "modrá", "žlutá"), ("green", "blue", "yellow")) {'zelená': 'green', 'modrá': 'blue', 'žlutá': 'yellow'} """ # Vzorové riešenie: return dict(zip(klice, hodnoty)) # Alternatívne riešenie: result = {} for key, value in zip(klice, hodnoty): result[key] = value return result # Napište definici ​funkce6, která získá jako parametr ​seznam (​list řetězců). # Vytvořte nový list, který bude obsahovat řetězce skládající se z číslic. def funkce6(seznam: list): """ >>> funkce6(["1", "22", "33.3", "-44", "5555.5", "66", "1000", " 5"]) ['1', '22', '66', '1000'] """ # Vzorové riešenie: return [string for string in seznam if string.isdecimal()] # Uznali sme aj isdigit() a isnumeric(). # Nasledujúce riešenie bolo veľmi časté, ale nie je 100% správne. # Do výsledku by totiž zahrnie aj reťazec typu ' 5', ktorý je reprezentáciou # prirodzeného čísla, ale obsahuje aj iné znaky okrem číslic. result = [] for string in seznam: try: if int(string) >= 0: result.append(string) except ValueError: pass return result # Napište definici ​funkce7, která získá jako parametr ​seznam (​list řetězců). # Vytvořte nový list, který bude obsahovat pouze čísla menší nebo rovny 1000 # a ten vraťte jako návratovou hodnotu funkce. Výsledný list bude z čísel. def funkce7(seznam: list): """ >>> funkce7(["1", "22", "33.3", "444.4", "5555.5", "6666.66", 1000]) [1.0, 22.0, 33.3, 444.4, 1000.0] """ # Vzorové riešenie: result = [] for string in seznam: try: if float(string) <= 1000: result.append(float(string)) except ValueError: pass return result # Ak by zadanie garantovalo, že všetky reťazce budú reprezentovať čísla, šlo by použiť: return [float(string) for string in seznam if float(string) <= 1000] # Napište definici ​funkce8​, která získá jako parametr ​seznam (​list řetězců). # Vytvořte nový list, který bude obsahovat pouze prvky dělitelné 3 beze zbytku # a ten vraťte jako návratovou hodnotu funkce. def funkce8(seznam: list): """ >>> funkce8(["3", "22", "330", "27", "8", "10"]) ['3', '330', '27'] """ # Vzorové riešenie: result = [] for string in seznam: try: if int(string) % 3 == 0: result.append(string) except ValueError: pass return result # Ak by zadanie garantovalo, že všetky reťazce budú reprezentovať celé čísla, šlo by použiť: return [string for string in seznam if int(string) % 3 == 0] # Napište definici ​funkce9, která získá na vstupu řetězec ​lide (​str​), který bude obsahovat # jména a věk oddělená pomocí ',' a jednotlivé záznamy oddělené pomocí ';'​. # Jako tuple vraťte jméno nejmladšího člověka, nejstaršího a průměrný věk. def funkce9(jmena: str) -> tuple: """ >>> funkce9("Jan,20;Martin,26;Filip,25;Petr,30;Marek,25") ('Jan', 'Petr', 25.2) """ # Vzorové riešenie: zaznamy = jmena.split(';') # ['Jan,20', 'Martin,26', 'Filip,25', 'Petr,30', 'Marek,25'] dvojice = [zaznam.split(',') for zaznam in zaznamy] # [['Jan', '20'], ['Martin', '26'], ['Filip', '25'], ['Petr', '30'], ['Marek', '25']] najstarsi = max(dvojice, key=lambda dvojica: int(dvojica[1])) # ['Petr', '30'] najmladsi = min(dvojice, key=lambda dvojica: int(dvojica[1])) # ['Jan', '20'] suma_veku = sum(int(vek) for meno, vek in dvojice) # 126 pocet = len(dvojice) # 5 priemerny_vek = suma_veku / pocet # 25.2 return (najmladsi[0], najstarsi[0], priemerny_vek) # ('Petr', 'Jan', 25.2) # Alternatívne riešenie, zložitejšie a menej "pythonic", ale korektné: zaznamy = jmena.split(';') # ['Jan,20', 'Martin,26', 'Filip,25', 'Petr,30', 'Marek,25'] najstarsi = None najmladsi = None suma_veku = 0 for zaznam in zaznamy: meno, vek = zaznam.split(',') vek = int(vek) if najstarsi is None or vek > najstarsi[1]: najstarsi = (meno, vek) if najmladsi is None or vek < najmladsi[1]: najmladsi = (meno, vek) suma_veku += vek priemerny_vek = suma_veku / len(zaznamy) return (najmladsi[0], najstarsi[0], priemerny_vek) # Napište definici ​funkce10, která získá na vstupu řetězec ​jmena (​str​), který bude obsahovat jména oddělená pomocí ';'​. # Z tohoto řetězce vytvořte seznam a seřaďte jej a složte zpět do řetězce oddělená pomocí ';' # a tento řetězec vraťte jako návratovou hodnotu. def funkce10(jmena: str) -> str: """ >>> funkce10("Mary;Johny;Adam;Elisabeth;Susane;Mark;Peter") 'Adam;Elisabeth;Johny;Mark;Mary;Peter;Susane' """ # Vzorové riešenie: name_list = jmena.split(';') return ';'.join(sorted(name_list)) # Jedna z variant mala radiť mená zostupne: name_list = jmena.split(';') return ';'.join(sorted(name_list, reverse=True))