Úlohy k prednáške 2¶
Nižšie nájdeš úlohy na precvičenie z druhej prednášky JDA, kde sme rozoberali dátové štruktúry v Pythone. Úlohy sa zameriavajú na prácu so zoznamami, n-ticami, množinami a slovníkmi, a takisto na dátum a čas. Niektoré môžu vyžadovať väčšiu kreativitu, aby si porozumel(a) fungovaniu týchto kolekcií a objektov v Pythone. V rámci týchto úloh nepoužívaj žiadne pokročilé knižnice (napr. NumPy) či vstup z klávesnice (to príde neskôr). Cieľom je zautomatizovať si základné operácie s týmito dátovými štruktúrami, ako pridávanie, mazanie, nahrádzanie, mapovanie, či využívanie metód na prácu s časom.
1. Listová štatistika¶
- Vytvor premennú
numbers
, ktorá bude obsahovať dvadsať náhodných čísel (môžeš ich zapísať ručne alebo generovať). - Napíš kód, ktorý:
- Spočíta priemernú hodnotu týchto čísel.
- Nájde maximálnu a minimálnu hodnotu.
- Nahradí posledných 5 prvkov za novú postupnosť (napr.
[99, 98, 97, 96, 95]
).
- Vypíš upravený zoznam a výsledky (priemer, min, max).
Tip: Premýšľaj, kedy je vhodné použiť funkciu sum
, len
, prečo je priemer sum(numbers)/len(numbers)
a ako využiť slicing na nahradenie posledných 5 prvkov.
# YOUR CODE
2. N-tice a rozbaľovanie parametrov¶
- Definuj n-ticu
student_info
, ktorá bude obsahovať informácie o študentovi: napr.(meno, priezvisko, vek, priemerná_znamka)
. - Rozbaľ ju do premenných
name, surname, age, average_grade
. - Vytvor funkciu
print_student_info(info_tuple)
, ktorá očakáva 4-hodnotovú n-ticu a pekne ju vypíše v tvare:Meno: ... Priezvisko: ... Vek: ... Priemerná známka: ...
- Otestuj funkciu s vlastnou n-ticou
student_info
. - Čo sa stane, ak n-tica nebude mať 4 prvky? Vyskúšaj.
Poznámka: Vďaka n-tici môžeme jasne vyjadriť, že ide o nemenný set informácií o študentovi. Hodí sa to pri odovzdávaní viacerých hodnôt naraz.
# YOUR CODE
3. Filter a zjednotenie množín¶
- Vytvor premenné
letters_a
aletters_b
, obe budú množiny (sets) s písmenami (napr.{'a','b','d','f'}
a{'b','c','d','x'}
). - Nájdi:
- Zjednotenie
letters_a
aletters_b
- Prienik
- Rozdie.
- Zjednotenie
- Z týchto množín vytvor
zoznam
a usporiadaj ho abecedne. - Napíš krátky kód, ktorý z množiny
letters_a
vyfiltruje (pomocou set comprehension) len tie písmená, ktoré sa nachádzajú v rozmedzí'b' <= písmeno <= 'x'
. Teda ak napr.letters_a
obsahuje znaky mimo tohto rozsahu, tie sa vynechajú.
Cieľ: Precvičiť bežné operácie na množinách, prácu s operátormi, konverziu set -> list -> triedenie, a set comprehension.
# YOUR CODE
4. Zlúčenie dvoch slovníkov¶
Predstav si, že máš dva slovníky dict_a
a dict_b
, ktoré reprezentujú napr. konfigurácie alebo nastavenia. Oba môžu obsahovať rovnaké kľúče.
- Vytvor
dict_a
ajdict_b
ručne, napr.:dict_a = {"width": 800, "height": 600, "title": "My App"} dict_b = {"width": 1024, "fullscreen": True, "theme": "dark"}
- Napíš kód, ktorý vytvorí nový slovník
merged_dict
, kde:- Ak nejaký kľúč existuje iba v
dict_a
, prevezmú sa jeho údaje. - Ak nejaký kľúč existuje iba v
dict_b
, prevezmú sa jeho údaje. - Ak nejaký kľúč existuje v oboch slovníkoch, prednosť dostane hodnota z
dict_b
.
- Ak nejaký kľúč existuje iba v
- Vypíš
merged_dict
. Malo by obsahovať kľúčewidth
,height
,title
,fullscreen
,theme
, s príslušnými hodnotami (awidth
už bude 1024).
Cieľ: Precvičiť prácu so slovníkmi, prepis hodnôt pri rovnakých kľúčoch, prípadne novšie spôsoby zlúčenia dictionaries.
# YOUR CODE
5. História výskytu slov (slovník + list)¶
- Vytvor reťazec
text
s nejakou vetou, napr."apple banana apple orange banana apple"
. - Rozdeľ ho podľa medzier na list slov.
- Pomocou slovníka
counts
spočítaj, koľkokrát sa každé slovo v texte vyskytuje. - Vypíš zoznam
(slovo, počet)
, napr.:apple -> 3 banana -> 2 orange -> 1
- Napíš krátky kód, ktorý všetky slová s
count == 1
(tzn. tie, ktoré sa vyskytli iba raz) uloží do množinyunique_words
.
Cieľ: Zistiť, ako vytvoriť histogram / počty výskytov pomocou slovníka, precvičiť rozdeľovanie reťazca na list (metóda split
) a prípadne usage množiny.
# YOUR CODE
6. Maticové operácie (pokročilejšie listy)¶
- Vytvor dvojrozmerný zoznam (tzv. matica) s rozmermi 3x3 (napr.
matrix = [[1,2,3],[4,5,6],[7,8,9]]
). - Vypíš súčet všetkých prvkov matice.
- Vytvor novú maticu
matrix_t
, ktorá bude transpozícia pôvodnej matice (riadky sa stanú stĺpcami). Napíš to bez použitia knižnice NumPy – ručne, cez list comprehension a indexing. - Vypíš aj pôvodnú, aj transponovanú maticu, nech je vidno rozdiel.
Poznámka: Študenti, ktorí poznajú NumPy, by vedeli transpozíciu spraviť ľahko, ale tu si to vyskúšaj ručne, aby si precvičil slicing/indexing vo vnorenej štruktúre.
# YOUR CODE
7. Shallow vs. deep copy v praxi¶
- Vytvor list
original_list = [ [1,2], [3,4] ]
. - Vytvor
copy_list = original_list[:]
(shallow copy) aimport copy; deep_list = copy.deepcopy(original_list)
. - Zmeň
original_list[0][0]
na"X"
. - Vypíš všetky tri listy. Čo vidíš?
- Zmeň
original_list[0]
na úplne nový sub-list (napr.[9,9]
) a znova všetko vypíš. Čím sa to líši oproti prvému prípadu?
Cieľ: Na konkrétnom príklade pochopiť rozdiel medzi povrchnou a hĺbkovou kópiou a vidieť, že ak meníme vnútorné štruktúry, shallow copy zdieľa referenciu.
# YOUR CODE
8. Formátovanie času a dňa v týždni¶
- Načítaj aktuálny čas do premennej
now = datetime.now()
. - Vypíš ho v tvare
HH:MM
, napr.14:07
. - Zisti, ktorý je to deň v týždni – použijeme
weekday()
(0=pondelok, 6=nedeľa) aleboisoweekday()
(1=pondelok, 7=nedeľa). - Napíš krátky kód, ktorý mapuje číselnú hodnotu na reťazec (napr.
1 -> "pondelok", 2 -> "utorok", ...
). - Vypíš to v tvare:
Aktuálny čas je 14:07, dnes je streda.
Cieľ: Precvičiť modul datetime
, formátovanie strftime
, priradenie a mapovanie dňa v týždni na slovný názov.
# YOUR CODE