Slovník, čtení ze souboru
Lekce 08
Úlohy
- U některých úkolů je specifikováno, že vstup má být čtený ze souboru.
- Jinde čtěte ze standardního vstupu, tedy z příkazového řádku.
- V tomto adresáři jsou vstupy
*-in.txta očekávané výstupy*-exp.txt.- Adresář si jde stáhnout jako ZIP.
- Můžete je použít na otestování vašeho kódu
- Nahrajte je do vašeho repozitáře, do adresáře
08/<jmeno ulohy>- Na odevzdání máte tři týdny, tedy do 13. listopadu. Za úkoly je hodně bodů, nepodceňte to.
- Silně doporučuji začít pracovat již tento týden, ať si o prázdninách můžete odpočinout a poté pokračovat v práci.
Prkna (4b)
- Máme dřevěná prkna různých délek. Jejich délky dostanete na vstupu na jednom řádku, budou to celá čísla.
- Najděte dvě prkna, jejichž celková délka bude
D.- Hodnotu
Ddostanete na druhém řádku.
- Hodnotu
- Napište do komentáře v programu, jak rychle váš program běží v závislosti na počtu prken.
Chybějící číslo (6b)
- Jako argument programu dostanete jméno souboru.
- V něm dostanete
N-1čísel, na každém řádku jedno. - Jsou to čísla od 1 do
N(včetně) v náhodném pořadí, ale jedno z těchto čísel chybí. - Zjistěte, které je chybějící číslo.
- Hodnotu
Nneznáte dopředu. Umíte ji však zjistit podle počtu řádků v souboru. - Nápověda: Pomocí
for line in fpřečtěte čísla a uložte si je do seznamu. - Těžší verze (8b): Vyřešte úlohu, aniž byste si museli všechna čísla ukládat.
Liga (7b)
- Tým hraje v lize. Známe výsledky jeho zápasů.
- Na vstupu dostanete řetězec složený z písmen
VaP.Vznačí výhru,Pznačí prohru.- Za výhru tým dostane 1 bod, za prohru 1 bod ztratí.
- Najděte období, během kterého tým získal v součtu nejvíce bodů.
- Vypište pořadové číslo prvního a posledního zápasu tohoto období. Číslujeme od 1.
- Nápověda: Procházejte zápasy postupně a počítejte si průběžný součet bodů.
- Pamatujte si dosud minimální součet bodů.
- Spočítejte, kolik bodů by tým získal od minima do aktuálního zápasu.
- Hledejte nejvyšší takovou hodnotu.
Rejstřík (9b)
- Jako argument programu dostanete jméno souboru.
- Soubor přečtěte, vhodně předzpracujte a zavřete.
- Poté na standardním vstupu dostanete jedno slovo.
- Vypište čísla řádků, na kterých se toto slovo vyskytuje.
- Nápověda: Použijte slovník. Klíč bude slovo, hodnota seznam řádků.
Piškvorky (10b)
- Jako argument programu dostanete jméno souboru.
- V něm bude hrací pole o velikosti
10 x 10. Tedy 10 řádků, na každém 10 znaků.- Znaky
x,ojsou symboly hráčů,.značí prázdné pole.
- Znaky
- Rozhodněte, jestli má nějaký hráč 5 symbolů v řadě, případně kdo.
- Nápověda: Projděte všechna políčka. Pro každé políčko ověřte všech 8 směrů.
- Ověření směru může být funkce, které zadáte počáteční políčko (2 čísla) a směr (2 čísla).
- Napište si funkci, která vám vrátí symbol na daném políčku. Pokud je mimo hrací pole, vrátí například
..
Co jsme dnes dělali
Slovníky (dictionary, hashmap, map)
- Seznamy mají velkou nevýhodu - umožňují nám k prvkům přímo 1 přistupovat jen pomocí indexů
- Budeme ale chtít hodnoty přiřazovat i jiným typům. Třeba ke jménu?
- Chceme si pamatovat klíč a hodnotu
- Slovník založíme jako
s = {} - Syntax je poté podobný seznamům, tedy
- Přiřazení do slovníku
1 pocty_bodu = {} 2 3 # Terka má 6 bodů 4 pocty_bodu["Terka"] = 6 - Klíč nemusí být řetězec, může to být i číslo
- Otázka "je klíč ve slovníku?"
1 if "Terka" in pocty_bodu: 2 ... - Iterace přes klíče
1 for klic in pocty_bodu: 2 ... - Iterace přes klíče i hodnoty
1 for klic, hodnota in pocty_bodu.items(): 2 ...
- Přiřazení do slovníku
Argumenty programu
- Když spouštíme program, můžeme mu dávat argumenty
git clone https://...clonea URL po něm jsou argumenty
cd slozkaslozkaje argument
- I našemu programu můžeme dávat argumenty
- V kódu je najdeme v seznamu
sys.argv- Nejprve musíme importovat modul
sys(import sys) - Poté můžeme číst argumenty
- Nejprve musíme importovat modul
- Pokud náš program zavoláme s argumenty
ahoj,svete- Tedy takto:
python program.py -- ahoj svete - V
sys.argvby bylo toto:["program.py", "ahoj", "svete"]- Jak vidíte, první argument je na indexu 1
- Tedy takto:
Další možnosti čtení ze vstupu
- Už umíme číst:
- jednoduchý vstup (jedno číslo, jeden řetězec)
- více čísel (a tedy i více řetězců) pomocí funkce
split()
- Co kdybychom chtěli, aby náš program dostal vstup z nějakého souboru
- Na to můžeme jít dvěma způsoby
- Přesměrování vstupu/výstupu
- Není to funkce Pythonu, ale příkazové řádky
- Provádí se operátory
<a> - Přesměrování vstupu do programu:
python program.py < in.txt- Obsah
in.txtse objeví programu jako kdybychom obsah souboru ručně psali my
- Obsah
- Přesměrování výstupu programu:
python program.py > out.txt- To, co vypíše náš program, se zapíše do souboru
out.txt
- To, co vypíše náš program, se zapíše do souboru
- V našem programu se nic nemění, stále můžeme používat funkci
input() - Jak nastavit přesměrování ve VS Code, pokud používám "play" tlačítko
na spouštění kódu?
- Vyber CMD jako výchozí terminál:
Ctrl+Shift+P->Terminal: Select Default Profile->Command Prompt - Vytvoř složku
.vscode, v ní souborlaunch.json - Zkopíruj do ni výchozí konfiguraci
- Dle potřeby uprav řádek 16
- Vyber CMD jako výchozí terminál:
- Čtení souboru v Pythonu
- Používáme k tomu funkci
open()- Tou soubor otevřeme
- Musíme ho pak i zavřít, o tom více později
- Příklad
1 with open("in.txt", "r") as f: 2 ... - Tímto jsme otevřeli soubor
in.txtv režimur(jako read) - Máme ho k dispozici v proměnné
f - Používáme konstrukci
with, která soubor uzavře po tom, co z ni odejdeme
- Tímto jsme otevřeli soubor
- Přečíst všechny řádky v souboru
1 with open("in.txt", "r") as f: 2 for line in f: 3 print(line) - Pozor: pokud chceme s řádkem dělat něco smysluplného, musíme na něm
zavolat funkci
strip- Na konci každého řádku je totiž znak
\n, který by nám v našem kódu mohl dělat neplechu
- Na konci každého řádku je totiž znak
- Podobně můžeme do souboru i zapisovat
- Otevřeme soubor v režimu
w(jako write) - Na souboru zavoláme funkci
f.write()
- Otevřeme soubor v režimu
- Používáme k tomu funkci
-
přímo myšleno bez hledání ↩