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.
22. 4. 2021 změněno zadání: přidána zmínka o WASD
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 (?).
22. 4. 2021 změněno zadání: seznam s jídlem může mít víc prvků.
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?