append, remove, pop, len, in, řezyZačni problémem, ne řešením. Napiš:
A co když hrdina najde čtvrtou věc? A dvacátou? Budeš psát dvacet proměnných? A jak zjistíš, kolik jich má? A jak jednu vyhodíš?
Tohle je bolest, kterou seznam řeší.
Seznam je jedna proměnná, do které se vejde libovolně mnoho hodnot. Jako batoh: má jedno jméno, ale uvnitř je věcí kolik chceš.
Index není „kolikátá věc", ale „o kolik kroků od začátku". První věc je na začátku, takže nula kroků. Proto
[0].
Pomůže jednoduchý náčrt řady krabiček s čísly nad nimi.
Časté chyby:
inventar[3] # IndexError - seznam má jen indexy 0,1,2
Když má seznam tři věci, poslední index je dvojka, ne trojka. Poslední index je vždycky
len(seznam) - 1. Nebo prostě použij[-1].
removeřekne co smazat.popřekne odkud vzít — a ještě ti to podá do ruky. Rozdíl je jako mezi „vyhoď ten meč" a „podej mi, co je nahoře".
Důležité upozornění:
inventar.remove("kladivo") # ValueError, když tam kladivo není
Vždycky nejdřív zkontrolovat: if "kladivo" in inventar:
len(inventar) # kolik věcí
"meč" in inventar # True/False
inventar.count("lektvar") # kolikrát tam je
inventar.index("štít") # na jaké pozici
in je nesmírně užitečné a budeš ho používat neustále.
Takto jednoduše můžeš ověřit, jestli v inventáři něco je, a podle toho reagovat.
Druhé číslo je „kam už nesahám".
[0:3]znamená „ber od nuly, ale u trojky se zastav". Vypadá to divně, ale výhoda je, že[0:3]vrátí přesně 3 věci.
inventar.sort() # seřadí NA MÍSTĚ, nic nevrací
inventar.reverse() # otočí na místě
serazeny = sorted(inventar) # vrátí NOVÝ seřazený, původní nechá
Pozor na past:
x = inventar.sort()uloží doxhodnotuNone. Metody končící nasort()areverse()mění seznam přímo a nic nevracejí.
To se hodí na statistiky souboje.
Streamlit umí seznam zobrazit několika způsoby:
st.selectbox a st.multiselect berou seznam přímo jako parametr — uvidíš výsledek hned a je to velmi praktické.
list je dynamické pole (jako List<T> v C#), amortizované O(1) append,
ale O(n) insert(0, ...) a remove().b = a nevytvoří kopii!
Kopie je b = a.copy() nebo b = a[:]. Toto dětem ukažte, až narazí na chybu.session_state je seznam uložený jako reference, takže .append() na něm funguje
a změna se zachová bez nutnosti přiřazovat zpět.| Chyba | Příčina | Řešení |
|---|---|---|
IndexError: list index out of range |
Sáhl mimo seznam | Kontrolovat len() |
ValueError: x not in list |
remove() neexistující věci |
Nejdřív if x in seznam |
x = seznam.sort() je None |
sort() nic nevrací |
Použít sorted() |
| Změna v jednom seznamu se projeví v druhém | b = a je odkaz |
b = a.copy() |
IndexError na prázdném seznamu |
seznam[0] bez kontroly |
if seznam: |
| Seznam se pořád vyprazdňuje | Inicializace bez if not in |
Podmíněná inicializace |
import streamlit as st
st.title("Co je uvnitř seznamu")
inventar = ["meč", "štít", "lektvar", "klíč", "mapa"]
st.subheader("Seznam a jeho indexy")
sloupce = st.columns(len(inventar))
for i, sloupec in enumerate(sloupce):
sloupec.metric(f"[{i}]", inventar[i])
sloupec.caption(f"[-{len(inventar) - i}]")
st.divider()
st.subheader("Vyzkoušej si index")
index = st.slider("index", -len(inventar), len(inventar) - 1, 0)
st.code(f"inventar[{index}] -> {inventar[index]!r}")
st.divider()
st.subheader("Užitečné informace")
st.code(
f"len(inventar) -> {len(inventar)}\n"
f"'klíč' in inventar -> {'klíč' in inventar}\n"
f"'luk' in inventar -> {'luk' in inventar}\n"
f"inventar.index('štít') -> {inventar.index('štít')}\n"
f"inventar[-1] -> {inventar[-1]!r}"
)
import streamlit as st
st.title("Řezy seznamu")
inventar = ["meč", "štít", "lektvar", "klíč", "mapa", "lano"]
st.write("Původní seznam:", inventar)
od, do = st.slider(
"Vyber rozsah [od:do]",
0, len(inventar), (1, 4)
)
st.code(f"inventar[{od}:{do}] -> {inventar[od:do]}")
st.write(f"Počet vybraných: **{len(inventar[od:do])}**")
st.divider()
st.subheader("Hotové příklady")
st.code(
f"inventar[:3] -> {inventar[:3]}\n"
f"inventar[3:] -> {inventar[3:]}\n"
f"inventar[-2:] -> {inventar[-2:]}\n"
f"inventar[::2] -> {inventar[::2]} (každý druhý)\n"
f"inventar[::-1] -> {inventar[::-1]} (pozpátku)"
)
import streamlit as st
st.set_page_config(page_title="Inventář", page_icon="🎒")
st.title("🎒 Inventář hrdiny")
if "inventar" not in st.session_state:
st.session_state.inventar = ["meč", "lektvar"]
NALEZY = ["štít", "klíč", "mapa", "lano", "lektvar", "prsten"]
a, b = st.columns(2)
with a:
st.subheader("Přidat")
vec = st.selectbox("Co jsi našel?", NALEZY)
if st.button("➕ Sebrat"):
st.session_state.inventar.append(vec)
st.rerun()
with b:
st.subheader("Vyhodit")
if st.session_state.inventar:
k_vyhozeni = st.selectbox("Co vyhodíš?", st.session_state.inventar)
if st.button("➖ Vyhodit"):
st.session_state.inventar.remove(k_vyhozeni)
st.rerun()
else:
st.caption("Batoh je prázdný.")
st.divider()
inv = st.session_state.inventar
st.subheader(f"Obsah batohu ({len(inv)} věcí)")
if inv:
for i, v in enumerate(inv):
st.write(f"**[{i}]** {v}")
else:
st.info("Batoh je prázdný.")
st.divider()
st.code(
f"len(inventar) -> {len(inv)}\n"
f"'klíč' in inventar -> {'klíč' in inv}\n"
f"seřazeně -> {sorted(inv)}"
)
Tvoje zadání:
- Vytvoř seznam pěti kouzel, například
["Ohnivá koule", "Blesk", "Léčení", "Štít", "Neviditelnost"]- Vypiš kolik kouzel hrdina umí pomocí
len()- Vypiš první a poslední kouzlo (použij
[0]a[-1])- Přidej
st.selectbox, kterým si uživatel kouzlo vybere- Podle vybraného kouzla vypiš jeho index a jinou hlášku
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–4 |
| Rozšíření | Bod 5 + vypsat, jestli je kouzlo v první polovině seznamu |
| Výzva | Přidat druhý seznam s manou a spárovat je podle indexu |
Očekávaný výsledek: výběr kouzla ukáže jeho pořadí i popis.
Tvoje zadání:
- Ulož
batohdosession_statejako prázdný seznam- Přidej
st.selectboxs nabídkou věcí a tlačítko „Sebrat"- Nastav limit 5 věcí — když je batoh plný, vypiš
st.errora nic nepřidávej- Přidej tlačítko „Zahodit poslední" pomocí
.pop()- Ukaž zaplnění batohu přes
st.progress
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Body 4–5 |
| Výzva | Nedovolit dvě stejné věci (kromě lektvarů) |
Očekávaný výsledek: batoh se plní, po pěti věcech odmítá další.
Tvoje zadání:
- Vytvoř v session_state seznam
zraneni = []- Přidej
st.number_inputa tlačítko „Zapsat zranění"- Když je v seznamu aspoň jedno číslo, spočítej součet, největší, nejmenší a průměr
- Zobraz je pomocí čtyř
st.metricve sloupcích- Přidej
st.bar_chart(zraneni)— uvidí graf svých soubojů
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Body 4–5 |
| Výzva | Vypsat, kolikrát byl zásah nadprůměrný |
Očekávaný výsledek: graf roste s každým zápisem, statistiky se přepočítávají.
Tvoje zadání:
- Vytvoř seznam jmen členů družiny (aspoň 6)
- Přidej
st.radios možnostmi „Původní / Abecedně / Pozpátku"- Podle volby seznam seřaď (pozor:
sorted()vrací nový,sort()mění původní)- Vypiš seřazený seznam s čísly pořadí
- Přidej
st.multiselectna výběr, kdo jde na výpravu, a vypiš kolik jich jde
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–4 |
| Rozšíření | Bod 5 |
| Výzva | Přidat volbu „podle délky jména" pomocí sorted(jmena, key=len) |
Očekávaný výsledek: stejný seznam se zobrazuje v různých pořadích.
Tvoje zadání:
- Přidej do hry
inventarvsession_states výchozím obsahem["meč"]- Po úspěšné výpravě přidej do inventáře odměnu podle místa (Les → lano, Jeskyně → klíč, Věž → prsten)
- Zobraz inventář v postranním panelu
- Do Věže pusť hrdinu jen tehdy, když má v inventáři
"klíč"- Přidej tlačítko „Prodat vše" — každá věc dá 20 zlata a inventář se vyprázdní
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Bod 4 s kontrolou in |
| Výzva | Bod 5 + různé ceny pro různé věci |
Očekávaný výsledek: hra má funkční ekonomiku a postup blokovaný předmětem.
Přidej do hry obchod: seznam nabízeného zboží a tlačítko na koupi. Koupená věc se přidá do inventáře a odečte zlato. Nedovol koupit, když hrdina nemá dost zlata nebo když už věc má.
Toto je jedna z možných variant, jak mohl úkol dopadnout. Tvoje řešení se může lišit a to je v pořádku.
Oficiální dokumentace se hodí ve chvíli, kdy si chceš ověřit práci se seznamem, zjistit další užitečné metody nebo si připomenout, jak fungují řezy a indexy. U Streamlitu se pak vyplatí mrknout na widgety, které umí seznam použít přímo.
| Co jsme použili | Oficiální dokumentace | Co tam najdeš |
|---|---|---|
seznam list |
Sequence types — list, tuple, range |
základy seznamů, indexování i běžné operace |
append() |
list.append |
přidávání položek na konec seznamu |
remove() |
list.remove |
mazání položky podle hodnoty |
pop() |
list.pop |
odebrání a vrácení položky ze seznamu |
len() |
len |
zjištění počtu prvků |
operátor in |
Common sequence operations | test, jestli položka v seznamu je |
řezy seznam[a:b] |
Slicings | výběr části seznamu pomocí rozsahu |
sorted() a sort() |
sorted, list.sort |
řazení seznamu dvěma způsoby |
st.selectbox |
st.selectbox |
výběr jedné položky ze seznamu |
st.multiselect |
st.multiselect |
výběr více položek najednou |
enumerate() |
enumerate |
průchod seznamem spolu s indexy |
| Cvičení | Odkaz | Proč se hodí |
|---|---|---|
| Programování v Pythonu | umimeinformatiku.cz | Práce se seznamy |
| Tabulky | umimeinformatiku.cz | Data v řadách a sloupcích |
| Robotanik | umimeinformatiku.cz | Posloupnosti kroků |
| Úkolovka | umimeinformatiku.cz | Seznam úkolů |