Chcete-li psát kód v Pythonu s elegancí a v souladu s jeho duchem, představujeme vám přehled užitečných jednořádkových konstrukcí, které zjednoduší běžné úlohy.
Pro začínající programátory v Pythonu je klíčové pochopení základních datových struktur, jako jsou seznamy a řetězce. Mnoho operací s těmito strukturami lze efektivně realizovat pomocí stručných jednořádkových fragmentů kódu.
Je sice důležité, aby kód byl čitelný a snadno udržovatelný, nicméně Python umožňuje vytvářet jednořádkové výrazy, které jsou v souladu s osvědčenými postupy programování.
V tomto článku se zaměříme na jednoduché řádky kódu pro běžné operace se seznamy a řetězci v Pythonu.
Začněme tedy!
Generování seznamu čísel
K vytvoření seznamu čísel se nejčastěji používá funkce range()
. Tato funkce vrací objekt typu range
, který lze převést na seznam. Použití range(n)
vytvoří sekvenci čísel 0, 1, 2, …, n-1.
>>> cisla = list(range(10)) >>> cisla [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Další informace o funkci range()
.
Funkci range()
lze použít i s volitelným krokem. Například range(start, konec, krok)
vytvoří sekvenci čísel start, start + krok, start + 2*krok, atd. Poslední číslo v sekvenci bude start + k*krok takové, že (start + k*krok) < konec a (start + (k+1)*krok) > konec.
Nalezení maximální a minimální hodnoty v seznamu
Pro získání maximálního a minimálního prvku v seznamu můžete využít vestavěné funkce max()
a min()
.
>>> min_prvek, max_prvek = min(cisla), max(cisla) >>> min_prvek 0 >>> max_prvek 9
📑 Poznámka k vícenásobnému přiřazení
Všimněte si, že jsme přiřadili hodnoty proměnným min_prvek
a max_prvek
v jediném příkazu. Python umožňuje vícenásobné přiřazení, které je užitečné při rozbalování iterovatelných objektů a přiřazování hodnot více proměnným současně.
Odstranění duplicit ze seznamu
Další běžnou operací je odstraňování duplicitních prvků ze seznamů v Pythonu. To je nezbytné, když potřebujete pracovat pouze s jedinečnými hodnotami. Nejjednodušší způsob, jak toho dosáhnout, je převést seznam na množinu.
Množina je vestavěná datová struktura, jejíž všechny prvky jsou jedinečné a hashovatelné.
>>> cisla1 = [2,4,7,9,7,10]
V seznamu cisla1
se prvek 7 objevuje dvakrát. Převodem na množinu se odstraní duplikát (zde 7) a zůstane seznam jedinečných hodnot.
Protože ale stále potřebujeme pracovat se seznamem, převedeme množinu zpět na seznam. Tuto operaci lze provést pomocí následujícího řádku kódu:
>>> cisla1 = list(set(cisla1)) >>> cisla1 [2, 4, 7, 9, 10]
📒 Chcete-li se dozvědět více o dalších technikách odstraňování duplicit ze seznamů v Pythonu, prostudujte si tento návod.
Spočítání výskytů v seznamu
Pro zjištění, kolikrát se prvek v seznamu vyskytuje, můžete použít vestavěnou metodu count()
. list.count(prvek)
vrací počet výskytů prvek
v daném seznamu.
>>> cisla [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
V seznamu cisla
se číslo 7 vyskytuje jednou, proto metoda count()
vrátí 1.
>>> cisla.count(7) 1
Kontrola, zda všechny prvky v seznamu splňují podmínku
K ověření, zda všechny prvky v seznamu splňují danou podmínku, můžete použít vestavěnou funkci all()
v Pythonu.
Funkce all()
přijímá iterovatelný objekt a vrací True
, pokud všechny prvky v iteraci se vyhodnotí jako True
(nebo jsou pravdivé).
V tomto příkladu chceme zkontrolovat, zda jsou všechna čísla v seznamu cisla2
lichá.
>>> cisla2 = [3,4,7,11,21,67,12]
Pro vytvoření seznamu booleanů můžeme použít list comprehension a tento seznam pak předat funkci all()
.
Výraz num%2!=0
bude False
pro čísla 4 a 12, která jsou sudá. Seznam booleanů, vytvořený pomocí list comprehension, tedy bude obsahovat False
(a all(seznam)
vrátí False
).
>>> all([num%2!=0 for num in cisla2]) False
💡 Je důležité si uvědomit, že all([])
(all
s prázdnou iterovatelnou hodnotou) vrací True
.
Kontrola, zda alespoň jeden prvek v seznamu splňuje podmínku
Pro zjištění, zda alespoň jeden prvek v seznamu splňuje podmínku, se používá funkce any()
. any(seznam)
vrátí True
, pokud se alespoň jeden prvek vyhodnotí jako True
.
>>> cisla2 = [3,4,7,11,21,67,12]
Stejně jako v předchozím příkladu, používáme list comprehension k získání seznamu booleanů. Seznam čísel obsahuje sudá čísla, proto funkce any()
vrátí True
.
>>> any([num%2 for num in cisla2]) True
Obrácení řetězce
Řetězce v Pythonu jsou neměnné, proto při obrácení řetězce získáme pouze obrácenou kopii. Existují dva běžné přístupy – oba lze zapsat jako jediné řádky kódu – s využitím slicingu a vestavěných funkcí.
Použití slicingu řetězce
Řetězec s negativní hodnotou kroku vrátí část řetězce od konce. Syntaxe je řetězec[start:stop:step]
. Co tedy vrátí nastavení kroku na -1 a ignorování indexů start a stop?
Vrací kopii řetězce začínající od konce – včetně každého znaku.
>>> retezec1 = 'ahoj' >>> retezec1[::-1] 'joha'
Použití funkce reversed()
Vestavěná funkce reversed()
vrací reverzní iterátor přes danou sekvenci.
>>> reversed(retezec1) <reversed object at 0x008BAF70> >>> for znak in retezec1: ... print(znak) ... a h o j
Lze ji použít v kombinaci s metodou join()
:
>>> ''.join(reversed(retezec1)) 'joha'
Převod řetězce na seznam znaků
Předpokládejme, že chceme rozdělit řetězec na seznam znaků. Můžeme to udělat pomocí list comprehension.
>>> retezec1 = 'ahoj'
List comprehension jsou jedním z nejvýkonnějších nástrojů v Pythonu.
📒 Zjistěte více o list comprehension v Pythonu.
Projdeme řetězec a získáme každý znak.
>>> znaky = [znak for znak in retezec1] >>> znaky ['a', 'h', 'o', 'j']
Pro rozdělení delšího řetězce na seznam řetězců při každém výskytu mezery, můžete použít metodu split()
.
>>> retezec2 = 'ahoj svete' >>> retezec2.split() ['ahoj', 'svete']
Už jsme viděli, jak používat list comprehension k rozdělení řetězce na seznam znaků. Nyní musíme procházet řetězec a vybrat pouze číslice.
- V list comprehension můžeme použít podmínku pro filtrování pomocí metody
isdigit()
. znak.isdigit()
vrátíTrue
pokudznak
je číslice, jinak vrátíFalse
.
>>> retezec3 = 'python3' >>> cifry = [c for c in retezec3 if c.isdigit()] >>> cifry ['3']
Kontrola, zda řetězec začíná konkrétním podřetězcem
Pro ověření, zda řetězec začíná daným podřetězcem, můžete použít metodu startswith()
. retezec.startswith(podretezec)
vrátí True
, pokud řetězec začíná podřetězcem. V opačném případě vrátí False
.
Zde je několik příkladů:
>>> retezec4 = 'kodovani' >>> retezec4.startswith('ko') True
>>> retezec5 = 'python' >>> retezec5.startswith('ko') False
Kontrola, zda řetězec končí konkrétním podřetězcem
Jak jste možná uhodli, k ověření, zda řetězec končí daným podřetězcem, se používá metoda endswith()
.
>>> retezec5 = 'python' >>> retezec5.endswith('on') True
Metodu řetězce můžeme také použít v list comprehension k získání seznamu booleanů konci_na
.
>>> retezce = ['python','neon','nano','silikon']
>>> konci_na = [retezec.endswith('on') for retezec in retezce] >>> konci_na [True, True, False, True]
Spojení prvků seznamu do řetězce
Už jsme viděli, jak rozdělit řetězec na seznam znaků. Jak nyní provedeme opačnou operaci spojení prvků seznamu do řetězce?
K tomu lze použít metodu join()
se syntaxí: oddělovač.join(seznam)
.
Chceme pouze spojit prvky v seznamu do jednoho řetězce, bez jakéhokoli oddělovače. Oddělovač tedy nastavíme na prázdný řetězec.
>>> seznam_1 = ['p','y','t','h','o','n','3'] >>> ''.join(seznam_1) 'python3'
Vytvoření slovníku Python
Stejně jako nám list comprehension pomáhají vytvářet nové seznamy z existujících iterovatelných objektů, tak i dictionary comprehension nám mohou pomoci vytvářet nové slovníky z existujících iterovatelných objektů.
Dictionary comprehension v Pythonu jsou výkonné jednorádkové nástroje pro dynamické vytváření slovníků.
Zde máme seznam jmen.
>>> jmena = ['Karel','Eva','Petr','Tereza']
Vytvoříme jmena_d
, slovník obsahující jména jako klíče a délky jmen jako hodnoty.
>>> jmena_d = {jmeno:len(jmeno) for jmeno in jmena} >>> jmena_d {'Karel': 5, 'Eva': 3, 'Petr': 4, 'Tereza': 6}
Podmíněné přiřazování hodnot proměnným
Někdy může být nutné přiřadit hodnotu proměnné v závislosti na určité podmínce.
Můžete například načíst věk uživatele a na základě této hodnoty rozhodnout, zda se může zúčastnit večírku.
Pro podmíněné přiřazení v Pythonu lze použít jednorádkovou konstrukci s ternárním operátorem.
>>> vek = 21 >>> povolen = True if vek >= 18 else False >>> povolen True
🔖 Zjistěte více o ternárním operátoru v Pythonu.
Generování všech permutací
Permutace označuje možné uspořádání prvků ve skupině. Pokud je ve skupině n jedinečných prvků, existuje n! možností, jak je uspořádat – tedy n! permutací.
Použijme seznam písmen:
>>> pismena = ['a','b','c']
Pomocí funkce permutations
z modulu itertools
můžeme vygenerovat všechny možné permutace dané iterovatelné hodnoty.
>>> pismena_p = permutations(pismena) >>> pismena_p <itertools.permutations object at 0x0127AF50>
Jak je vidět, použití permutations()
vrací objekt permutací, přes který lze iterovat cyklem for
:
>>> for p in pismena_p: ... print(p) ... ('a', 'b', 'c') ('a', 'c', 'b') ('b', 'a', 'c') ('b', 'c', 'a') ('c', 'a', 'b') ('c', 'b', 'a')
Můžeme to ale zapsat jako jednorádkovou konstrukci převodem objektu permutací na seznam:
>>> pismena_p = list(permutations(pismena)) >>> pismena_p [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
Zde jsou tři jedinečné prvky, tedy existuje 3! = 6 možných permutací.
Generování podmnožin seznamu
Někdy může být potřeba vytvořit všechny možné podmnožiny určité velikosti ze seznamu nebo jiných iterovatelných objektů. Použijme seznam písmen a vytvořme všechny podseznamy velikosti 2.
K tomu lze použít combinations
z modulu itertools
:
>>> from itertools import combinations
>>> pismena_2 = list(combinations(pismena,2)) >>> pismena_2 [('a', 'b'), ('a', 'c'), ('b', 'c')]
Závěr
V tomto tutoriálu jsme si představili užitečné jednořádkové konstrukce v Pythonu pro běžné operace se seznamy a řetězci. Naučili jsme se také jednoduché koncepty, jako je list comprehension a dictionary comprehension, a jak je používat v kombinaci s vestavěnými funkcemi pro efektivní řešení úloh.
Pro další krok si prohlédněte tento seznam projektů v Pythonu pro začátečníky.