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.txt
a 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
D
dostanete 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
N
neznáte dopředu. Umíte ji však zjistit podle počtu řádků v souboru. - Nápověda: Pomocí
for line in f
př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
V
aP
.V
značí výhru,P
značí 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
,o
jsou 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
pocty_bodu = {} # Terka má 6 bodů pocty_bodu["Terka"] = 6
- Klíč nemusí být řetězec, může to být i číslo
- Otázka "je klíč ve slovníku?"
if "Terka" in pocty_bodu: ...
- Iterace přes klíče
for klic in pocty_bodu: ...
- Iterace přes klíče i hodnoty
for klic, hodnota in pocty_bodu.items(): ...
- Přiřazení do slovníku
Argumenty programu
- Když spouštíme program, můžeme mu dávat argumenty
git clone https://...
clone
a URL po něm jsou argumenty
cd slozka
slozka
je 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.argv
by 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.txt
se 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
with open("in.txt", "r") as f: ...
- Tímto jsme otevřeli soubor
in.txt
v 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
with open("in.txt", "r") as f: for line in f: 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í ↩