16 užitečných Python One-Liners pro zjednodušení běžných úloh

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 pokud znak 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.