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š.
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))
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
.