Kódím.cz
7

Komplexní příklad

Podíváme se na komplexnější příklad, ve kterém propojíme probírané koncepty

Skvělí velitelé

Nyní je naším úkolem vytvořit seznam velitelů, kteří zvítězili v boji proti přesile. Budeme k tomu potřebovat sloupečky s výsledkem bitvy, informacemi o síle útočníků a obránců a se jmény velitelů. Pro tyto sloupečky si opět vytvoříme konstanty.

with open("battles.tsv", encoding="utf-8") as soubor:
    radky = soubor.readlines()

SL_VYSLEDEK = 13
SL_SILA_UTOCNICI = 17
SL_SILA_OBRANCI = 18
SL_VELITEL_UTOCNICI = 19
SL_VELITEL_OBRANCI = 20

Opět budeme procházet soubor řádek po řádku. Připravíme si nejprve podmínku, že je zadána síla útočníků i obránců, tj. že v daných sloupcích nejsou prázdné řetězce. Použijeme operátor and, který vyhodnotí celou podmínku jako pravda, pokud jsou pravda oba výrazy v podmínce.

velitele = []
for radek in radky[1:]:
    radek = radek.split("\t")
    if radek[SL_SILA_UTOCNICI] != "" and radek[SL_SILA_OBRANCI] != "":

Dále si položme otázku: Kdy je vlastně bitva vyhraná? Pro naše data jde o následující dvě situace:

  • síla útočníků je větší než síla obránců a útočníci prohráli,
  • síla útočníků je menší než síla obránců a útočníci vyhráli.

První podmínku můžeme zapsat jako

        if float(radek[SL_SILA_UTOCNICI]) > float(radek[SL_SILA_OBRANCI]) and radek[SL_VYSLEDEK] == "loss":

V řadě bitev dále platí, že armádu vedlo více velitelů. Velitelé jsou oddělení čárkami. Abychom z řetězce vytvořili seznam, kde bude každý velitel jako samostatná položka, použijeme metodu .split().

            radek_velitele = radek[SL_VELITEL_OBRANCI].split(", ")

Jako poslední krok je potřeba nově nalezené šťastlivce přidat do seznamu velitele. Nyní máme dva jednorozměrné seznamy, které chceme propojit. Nepoužijeme tedy metodu .append(), protože ta by vytvořila dvourozměrný seznam. Můžeme použít operátor +, tj. stejný operátor, jaký používáme při sčítání, který jednoduše spojí oba seznamy dohromady.

            velitele = velitele + radek_velitele

Zápis podmínek pro oba případy tedy můžete vypadat například takto:

        if float(radek[SL_SILA_UTOCNICI]) > float(radek[SL_SILA_OBRANCI]) and radek[SL_VYSLEDEK] == "loss":
            radek_velitele = radek[SL_VELITEL_OBRANCI].split(", ")
            velitele = velitele + radek_velitele
        elif float(radek[SL_SILA_UTOCNICI]) < float(radek[SL_SILA_OBRANCI]) and radek[SL_VYSLEDEK] == "won":
            radek_velitele = radek[SL_VELITEL_UTOCNICI].split(", ")
            velitele = velitele + radek_velitele

Nakonec zkontrolujeme výsledek. Ti, kteří četli knihy či viděli seriál, mohou zavzpomínat, které ze jmen postav jsou jim povědomé.

print(velitele)