python list comprehension iterátor
List comprehension umožňuje vytvářet seznamy (list) na základě jiných seznamů nebo iterovatelných objektů pomocí jednoduchého, deklarativního zápisu.
Jedná se vlastně o zkrácený zápis smyček for
.
Je to užitečná funkce, kterou mnoho programátorů využívá. Díky tomu se tento typ zápisu vyskytuje v mnoha příkladech.
Proto je dobré pochopit, jak list comprehension funguje.
Co je iterovatelný objekt?
V Pythonu se tyto objekty nazývají iterátory. To znamená, že hodnoty se poskytují postupně, jeden po druhém.
Objektem může být např. seznam, řetězec, množina, slovník, a podobně.
Iterátor prochází jednotlivé prvky v posloupnosti tak, aby nemusely být načítány všechny prvky najednou do paměti. To je užitečné pro práci s velkými množství dat, kde není vhodné načítat všechna data naráz.
Základy list comprehension
List comprehension vždy začíná zápisem ve hranatých závorkách.
Obsahuje dva klíčové prvky: výraz a for
cyklus.
Výraz je vyhodnocen pro každý prvek a výsledkem je nový seznam.
To možná zní trochu kostrbatě, ale když se podíváte na příklady, je princip docela jednoduchý.
Pro lepší pochopení si vyzkoušíte obě možnosti - použití for
smyček a použití list comprehension.
Příklad 1
V tomto příkladu vytvoříte seznamu čísel od 0 do 9. V obou případech bude výsledek stejný. Jen v tom druhém je zápis kratší.
# Smyčka for: Vytvoření seznamu čísel od 0 do 9
cisla = list()
for x in range(10):
cisla.append(x)
print(cisla)
# List comprehension: Vytvoření seznamu čísel od 0 do 9
cisla = [x for x in range(10)]
print(cisla)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Příklad 2
Tento krátký kód vygeneruje druhé mocniny. Opět, výsledky jsou stejné, jen druhý zápis je kratší.
# Smyčka for: Seznam druhých mocnin čísel od 0 do 9
mocniny = list()
for x in range(10):
mocniny.append(x**2)
print(mocniny)
# List comprehension: Seznam druhých mocnin čísel od 0 do 9
squares = [x**2 for x in range(10)]
print(squares) # Output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Příklad 3
List comprehension samozřejmě není omezen jen na práci s čísly. Stejným způsobem fungují i řetězce (stringy).
# Smyčka for: Vytvoření seznamu jednotlivých písmen
vzkaz = "Ahoj světe"
pismena = list()
for pismeno in vzkaz:
pismena.append(pismeno)
print(pismena)
# List comprehension: Vytvoření seznamu jednotlivých písmen
vzkaz = "Ahoj světe"
pismena = [pismeno for pismeno in vzkaz]
print(pismena)
['A', 'h', 'o', 'j', ' ', 's', 'v', 'ě', 't', 'e']
['A', 'h', 'o', 'j', ' ', 's', 'v', 'ě', 't', 'e']
Použití podmínky
List comprehension může také obsahovat podmínky, které určují, zda bude prvek zahrnut do výsledného seznamu.
Podmínka se umisťuje za výraz v seznamu a odděluje se pomocí klíčového slova if
.
V následujícím příkladu si vyzkoušíte jednoduchou podmínku. Python vám samozřejmě umožňuje vytvářet i mnohem komplexnější podmínky.
Následující příklad vybere ze seznamu pouze sudá čísla:
# Smyčka for: výběr pouze sudých čísel
suda_cisla = list()
vsechna_cisla = range(1,11) # Čísla 1-10
for cislo in vsechna_cisla:
if cislo % 2 == 0: # Je číslo dělitelné 2 beze zbytku?
suda_cisla.append(cislo)
print(suda_cisla)
# List comprehension: výběr pouze sudých čísel
vsechna_cisla = range(1,11) # Čísla 1-10
suda_cisla = [cislo for cislo in vsechna_cisla if cislo % 2 == 0] # Je číslo dělitelné 2 beze zbytku?
print(suda_cisla)
[2, 4, 6, 8, 10]
[2, 4, 6, 8, 10]
Délka slov
Pythonu podporuje funkce a proto je můžete používat i pro list comprehension.
Následující příklad načte seznam slov a vrátí seznam jejich délek:
# Smyčka for: Spočítej délku slov (počet znaků)
delky = list()
vsechna_slova = ["lovely", "data", "kurzy", "SQL", "artificial intelligence"]
for slovo in vsechna_slova:
delky.append(len(slovo))
print(delky)
# List comprehension: Spočítej délku slov (počet znaků)
vsechna_slova = ["lovely", "data", "kurzy", "SQL", "artificial intelligence"]
delky = [len(slovo) for slovo in vsechna_slova]
print(delky)
[6, 4, 5, 3, 23]
[6, 4, 5, 3, 23]
Poznámka: mezera se počítá jako 1 znak
Závěrem
List comprehension je užitečný a elegantní způsob pro manipulaci se seznamy v Pythonu.
V kombinaci s podmínkami umožňuje rychle a snadno filtrovat, mapovat a transformovat data. V praxi se často používá a určitě stojí za to zvládnout minimálně základy.