Pojďme si procvičit práci se seznamem.
Některé z projektů – a zvlášť ten poslední – potřebují trochu přemýšlení; nebude-li celý tým vědět jak dál, zeptejte se v diskusi ostatních a řešte společně!
Napište funkci vytvor_seznam_zvirat()
, která vytvoří nový seznam
domácích zvířat a vrátí ho.
Domácí zvířata známe tato: "pes", "kočka", "králík", "had"
.
Tuto funkci použijete pro otestování dalších úloh. Nehledejte v ní nic složitého.
Příklad:
>>> vytvor_seznam_zvirat()
['pes', 'kočka', 'králík', 'had']
Každé zavolání funkce by mělo vytvořit nový, nezávislý seznam. Vyzkoušejte si to následujícím „dialogem“:
>>> from moje_reseni import vytvor_seznam_zvirat
>>> zvirata = vytvor_seznam_zvirat()
>>> zvirata.pop()
'had'
>>> vytvor_seznam_zvirat()
['pes', 'kočka', 'králík', 'had']
>>> zvirata
['pes', 'kočka', 'králík']
Napište funkci filtruj_kratka_jmena
, která dostane seznam řetězců a vrátí
seznam těch, která jsou kratší než 5 písmen.
Například:
>>> from moje_reseni import vytvor_seznam_zvirat, filtruj_kratka_jmena
>>> zvirata = vytvor_seznam_zvirat()
>>> filtruj_kratka_jmena(zvirata)
['pes', 'had']
Vzpomeňte si, jak se vytváří seznam: začněte s prázdným seznamem a postupně přidávejte prvek po prvku.
Funkce by měla opět vracet nový seznam a svůj argument nechat nezměněný. Vyzkoušejte si to následujícím „dialogem“:
>>> from moje_reseni import vytvor_seznam_zvirat, filtruj_kratka_jmena
>>> zvirata = vytvor_seznam_zvirat()
>>> filtruj_kratka_jmena(zvirata)
['pes', 'had']
>>> zvirata
['pes', 'kočka', 'králík', 'had']
Napište funkci filtruj_k
, která dostane seznam řetězců a vrátí seznam těch,
která začínají na k
.
Například:
>>> from moje_reseni import vytvor_seznam_zvirat, filtruj_k
>>> zvirata = vytvor_seznam_zvirat()
>>> filtruj_k(zvirata)
['kočka', 'králík']
Funkce by měla opět vracet nový seznam a svůj argument nechat nezměněný.
Napište funkci obsahuje
, která dostane seznam a slovo a zjistí, jestli je
to slovo v daném seznamu.
Podle toho vrátí True
nebo False
.
Například:
>>> from moje_reseni import vytvor_seznam_zvirat, obsahuje
>>> zvirata = vytvor_seznam_zvirat()
>>> obsahuje(zvirata, 'pes')
True
>>> obsahuje(zvirata, 'vodováha')
False
Napište funkci bez_prvniho
, která dostane seznam jmen a vrátí seznam
se všemi jeho prvky kromě prvního.
>>> from moje_reseni import vytvor_seznam_zvirat, bez_prvniho
>>> zvirata = vytvor_seznam_zvirat()
>>> zvirata
['pes', 'kočka', 'králík', 'had']
>>> bez_prvniho(zvirata)
['kočka', 'králík', 'had']
Funkce by opět neměla změnit původní seznam:
>>> zvirata
['pes', 'kočka', 'králík', 'had']
A měla by fungovat i pro prázdný seznam:
>>> bez_prvniho([])
[]
Složitější, nepovinný úkol!
Had byl pyšný na to, že je v abecedě první.
Dokud nepřiletěla "andulka"
.
Abyste hada uklidnili, vytvořte funkci serad_od_druheho
,
která zvířata seřadí podle abecedy,
ale bude ignorovat první písmeno. Například:
>>> from moje_reseni import vytvor_seznam_zvirat, serad_od_druheho >>> zvirata = vytvor_seznam_zvirat() >>> serad_od_druheho(zvirata) ["had", "pes", "andulka", "kočka", "králík"] >>> # (barvy jsou tu jen pro přehlednost, váš program vypisuje bez barev)
Máte tady seznam hodnot, které chcete seřadit podle nějakého klíče. Klíč se dá z každé hodnoty vypočítat – v našem případě je to hodnota kromě prvního písmenka (tedy od druhého písmenka dál).
Postup:
(klíč, hodnota)
.Vytvoření seznamu se dělá tak, že začnete s prázdným seznamem a postupně do něj přidáváte hodnoty jednu po druhé.
Napište funkci vytvor_balicek
, která vrátí nový zamíchaný seznam hracích
karet pro hru Prší.
Každá položka seznamu bude (na rozdíl od balíčku z videa) dvojice hodnota-barva.
Hodnoty karet jsou 2-10, 'J'
, 'Q'
, 'K'
, 'A'
.
Barvy jsou '♥'
'♦'
'♠'
'♣'
.
(Symboly si můžete zkopírovat jako text. Nezobrazují-li se vám v příkazové
řádce správně, použijte místo nich S
, K
, P
, +
.)
Například:
>>> from moje_reseni import vytvor_balicek
>>> vytvor_balicek()
[(2, '♥'), (10, '♠'), ('A', '♣'), ...
Následující sada úkolů je nepovinná. Procvičuje seznamy a n-tice. Když ji uděláte, budeš mít další hru!
Úkoly dělejte postupně; navazují na sebe.
Úkol na procvičení a vzpomenutí. Už jste ho jednou vyřešili.
Pomocí cyklů for
a parametru end
pro print
napište program, který postupně z jednotlivých 'X'
vypíše:
X X X X X
X X X X X
X X X X X
X X X X X
X X X X X
„Z jednotlivých 'X'
“ znamená, že každý print
vypíše jen jedno X
.
Nepoužijete tedy např. print('X X X X X')
ani print('X ' * 5)
.
Úkol na procvičení a vzpomenutí. Už jste ho jednou vyřešili.
Napište program, který vypíše „tabulku“ s násobilkou.
0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12
0 4 8 12 16
Napište funkci, která dostane seznam souřadnic (párů čísel menších než 10,
která určují sloupec a řádek)
a vypíše je jako mapu: mřížku 10×10, kde na políčka která jsou v seznamu
napíše X
, jinde tečku.
Například:
nakresli_mapu([(0, 0), (1, 0), (2, 2), (4, 3), (8, 9), (8, 9)])
X . . . . . . . . .
X . . . . . . . . .
. . X . . . . . . .
. . . . . . . . . .
. . . X . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . X
. . . . . . . . . .
Jak na to?
for
zanořených
do sebe.radek_a_sloupec = (cislo_radku, cislo_sloupce)
.X
, pokud je dvojice radek_a_sloupec
v seznamu. Jinak napište .
.Slova jako „souřadice“ a „pozice“ bohužel vypadají v jednotném i množném
čísle stejně.
Abyste se nezamotali, doporučuju proměnnou s jednou dvojicí
pojmenovat radek_a_sloupec
a seznam několika takových dvojic
seznam_souradnic
.
Napište funkci pohyb
, která dostane seznam souřadnic a světovou stranu
("s"
, "j"
, "v"
nebo "z"
)
a přidá k seznamu poslední bod „posunutý“ v daném směru. Např.:
seznam_souradnic = [(0, 0)]
pohyb(seznam_souradnic, 'j')
print(seznam_souradnic) # → [(0, 0), (1, 0)]
pohyb(seznam_souradnic, 'j')
print(seznam_souradnic) # → [(0, 0), (1, 0), (2, 0)]
pohyb(seznam_souradnic, 'v')
print(seznam_souradnic) # → [(0, 0), (1, 0), (2, 0), (2, 1)]
pohyb(seznam_souradnic, 'z')
print(seznam_souradnic) # → [(0, 0), (1, 0), (2, 0), (2, 1), (2, 0)]
Funkce by neměla nic vracet. Jen mění už existující seznam.
Napište cyklus, který se bude ptát uživatele na světovou stranu,
podle ní zavolá pohyb
, a následně vykreslí seznam jako mapu.
Pak se opět se zeptá na stranu atd.
Začínejte se seznamem [(0, 0), (0, 1), (0, 2)]
.
Doplňte funkci pohyb
tak, aby při pohybu umazala první bod ze seznamu
souřadnic. Výsledný seznam tak bude mít stejnou délku jako před voláním.
Jestli hrajete počítačové hry a víte co je WASD
,
můžete změnit ovládání na tyto klávesy místo SZJV
.
Doplňte funkci pohyb
tak, aby zamezila:
Vhodná výjimka pro tyto situace je ValueError('Game over')
.
Teď máte hotový základ hry "Had"! Zkuste si s ní chvíli hrát.
Pak přidejte do hry hadí potravu.
Seznam jídla obsahuje na začátku dvě jídla na políčkách, na kterých není had
(například: jidlo = [(2, 3), (4, 5)]
znamená jedno jídlo na pozici
(2, 3) a druhé na (4, 5)).
Když had sežere jídlo, vyroste („nesmaže“ se mu ocas, tedy neprovede se to,
co jste přidali v předminulém úkolu)
a na náhodném místě (kde není had) se přidá jídlo nové.
Na mapě se jídlo zobrazuje třeba jako otazník (?
).
Hadí hřiště může mít libovolné rozměry větší než 4×1. Třeba 20×20 nebo 10×30.
A nakonec projekt na přemýšlení.
Zkuste co nejjednodušeji udělat takový seznam, aby platilo:
seznam[5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][5][0] == 5
Může seznam obsahovat sám sebe?