Načítavanie mágia

Ked uz teraz vieme ako použivať str.split, ukážme si ako by sme ho vedeli použiť na načítanie zoznamu čísel z jedného riadku.

Napríklad si predstav takýto vstup:

10 20 50 20 40

Tu vidíme nejakú priamočiaru implementáciu:

riadok = input()
tokeny = riadok.split()
cisla = []
for token in tokeny:
    cislo = int(token)
    cisla.append(cislo)

Vieme ju však aj ľahko skrátiť ak urobíme viacero krokov v jednom riadku:

cisla = []
for token in input().split():
    cisla.append(int(token))

Nasledujúce skrátenie sa volá list comprehension a je to pohodlný spôsob, ako kompaktne napísať jednoduché for-cykly, ktoré plnia zoznamy:

cisla = [int(token) for token in input().split()]

Všimni si, že celý proces prechodu cez tokeny a ich premena na čísla je teraz v jednom riadku. Vždy najprv napíš, čo chceš získať (int(token)), potom pre ktorý prvok to robíš (for token in input().split()).

List comprehension je veľmi praktický a môžeš ho používať nielen na zoznamy, ale aj na iné dátové štruktúry, len teraz to necháme bokom.

Nakoniec takýto tvar list comprehension-u, kedy iba aplikujeme funkciu na všetky prvky štruktúry vieme znovu kompaktnejšie zapísať pomocou funkcie map. V tomto prípade ide znova o male skrátenie, v ktorom uz nemusíme pisat premennú token, lebo to map "vyrieši" za nás:

cisla = list(map(int, input().split()))

Ak ti to teraz príde trochu zložité, neboj sa. Môžeš to pokojne používať a časom si na to zvykneš.

Vypisovanie join

Čo ak máš zoznam čísel a chceš ich vypísať na jeden riadok, oddelené medzerou? Ako na to?

Existujú rôzne spôsoby:

Prvý spôsob — postaviť reťazec postupným pridávaním:

cisla = [0, 1, 2, 3, 4]
riadok = ""
if len(cisla) > 0:
    riadok += str(cisla[0])
for i in range(1, len(cisla)):
    riadok += " " + str(cisla[i])

Tu najskôr pridáš prvé číslo bez medzery, potom k ďalším vždy pridáš medzeru a číslo.

Druhý spôsob — vytvoriť pomocný zoznam reťazcov a použiť metódu join:

tokeny = []
for cislo in cisla:
    tokeny.append(str(cislo))
riadok = " ".join(tokeny)
print(riadok)

Metóda join vezme všetky reťazce v zozname a spojí ich do jedného reťazca, kde medzi prvky vloží medzeru.

Ešte kompaktnejšie to napíšeš pomocou list comprehension:

tokeny = [str(cislo) for cislo in cisla]
riadok = " ".join(tokeny)
print(riadok)

A úplne najviac skrátene pomocou map:

tokeny = list(map(str, cisla))
print(" ".join(tokeny))

Nakoniec to môžeš rovno spojiť do jedného riadku:

print(" ".join(map(str, cisla))

Vypisovanie unpacking

Existuje ešte ďalší šikovný trik — unpacking operator *.

Keď máš nejakú iterovateľnú štruktúru, napríklad zoznam, môžeš ju rozbaliť na jednotlivé argumenty funkcie.

Napríklad:

print(0, 1, 2, 3, 4)
# output: "0 1 2 3 4"

cisla = [0, 1, 2, 3, 4]
print(cisla) # == print([0, 1, 2, 3, 4])
# output: "[0, 1, 2, 3, 4]"

print(*cisla) # == print(0, 1, 2, 3, 4)
# output: "0 1 2 3 4"

# pripadne sa moze hodit aj nieco taketo
print(*[x + 1 for x in cisla])
# output : "1, 2, 3, 4, 5"

Tento trik sa hodí, keď chceš rýchlo vypísať obsah zoznamu bez hranatých zátvoriek a bez nutnosti používať join.