V Pythonu se pro uchovávání posloupných nebo seřazených dat hojně využívají seznamy. Seznam v Pythonu je upořádaná, modifikovatelná a vestavěná datová struktura, která slouží k ukládání kolekcí dat. Jednotlivé položky v seznamu jsou indexovány od nuly a uživatelé mají možnost po vytvoření seznamu jeho obsah měnit.
Díky indexování prvků v seznamu je možné v něm mít duplicitní položky. Pythonovské seznamy mohou také obsahovat prvky různých datových typů. Položky jsou v seznamu odděleny čárkami a uzavřeny do hranatých závorek.
Zde jsou ukázky seznamů v Pythonu:
# Seznam obsahující jeden datový typ - řetězec barvy = ['Červená', 'Oranžová', 'Žlutá', 'Zelená', 'Modrá', 'Indigo', 'Fialová'] # Seznam obsahující více datových typů filmy = ['Transformers', 2012, 'Avengers', 300] # Seznam s duplicitními hodnotami uživatelé = ['Jan', 'Marie', 'Alžběta', 'Jan']
Seznamy jsou velmi flexibilní datovou strukturou a s daty v nich uloženými lze provádět mnoho různých operací. Mezi časté a užitečné operace se seznamy patří filtrování dat.
Proč je filtrování seznamů důležité?
Filtrováním seznamu se rozumí extrahování specifických podmnožin dat, které splňují určité zadané kritéria. Například nás mohou zajímat pouze sudá čísla v seznamu čísel od 1 do 10. K získání takových dat ze seznamu stačí seznam filtrovat a vybrat jen ta čísla, která jsou dělitelná dvěma beze zbytku.
Filtrování se hodí zejména při práci s daty a jejich analýzou, protože umožňuje odstranit nežádoucí položky ze seznamů, vytvářet nové seznamy s položkami splňujícími specifické podmínky a vybírat data, která vyhovují daným požadavkům.
Některé reálné aplikace filtrování seznamů zahrnují:
- Ověřování dat – Při práci se seznamem můžeme chtít pracovat jen s daty, která splňují určitá kritéria. Například v seznamu uživatelů nás mohou zajímat jen ti, kteří mají jak křestní jméno, tak příjmení. Filtrování nám umožňuje ověřit data v seznamu před jejich zpracováním a vyhnout se tak práci s daty, která nesplňují naše požadavky.
- Čištění dat – Jelikož seznamy mohou obsahovat různé datové typy, je běžné, že se v nich objeví i nežádoucí data. Například v seznamu obsahujícím názvy nás nemusí zajímat číselné hodnoty. Pomocí filtrování můžeme nežádoucí data odstranit.
- Analýza dat – Filtrování dat je obzvláště užitečné při analýze dat, protože nám umožňuje soustředit se na konkrétní podmnožiny dat, díky čemuž lze snadněji identifikovat vzorce a trendy. Například v seznamu studentů můžeme odfiltrovat studenty a studentky a použít výsledek pro další analýzu. Můžeme filtrovat i podle věku, lokality nebo třídy. Tímto způsobem můžeme dospět k mnohem relevantnějším závěrům z konkrétních podmnožin dat v seznamu.
Filtrování seznamů je velmi užitečná funkce, která nám dává kontrolu nad daty v seznamu a umožňuje nám pracovat pouze s daty, která nás zajímají.
Zaměření se na konkrétní podmnožiny dat v seznamu je velmi praktické, protože zjednodušuje zpracování a analýzu dat, díky čemuž jsou tyto procesy efektivnější, rychlejší a přesnější.
Použití funkce filter()
Funkce filter() je vestavěná funkce Pythonu, která se používá k procházení iterovatelnými objekty, jako jsou seznamy, n-tice, množiny nebo slovníky, a k vybírání těch položek, které splňují stanovenou podmínku.
Iterovatelný objekt v Pythonu je objekt, jehož prvky můžeme postupně procházet. Iterace vrací jednotlivé prvky iterovatelného objektu jeden po druhém.
Syntaxe funkce filter() je následující:
filter(funkce, iterovatelný_objekt)
funkce – funkce v Pythonu, která obsahuje podmínku pro filtrování
iterovatelný_objekt – iterovatelný objekt, který bude filtrován. V tomto případě použijeme seznam.
Funkce filter() přijme zadanou funkci a aplikuje ji na každou položku zadaného iterovatelného objektu, testujíc tak podmínku filtrování proti jednotlivým položkám. Pokud položka podmínku splňuje, tedy vrací booleovskou hodnotu true, bude funkcí filter() vybrána. V případě, že položka podmínku nesplní, vybrána nebude.
Funkce filter() vrací iterovatelný objekt s položkami, které splnily podmínku filtrování. S využitím funkce list() můžeme vytvořit nový seznam obsahující pouze položky, které splnily podmínku filtrování.
Pro demonstraci funkce filter() si představme seznam čísel, který je filtrován s cílem vybrat jen čísla menší než 50:
# Seznam čísel čísla = [79, 15, 92, 53, 46, 24, 81, 77, 37, 61] # Funkce obsahující podmínku filtrování def je_mensi_nez_50(num): if num < 50: return True else: return False # Funkce list() se používá k vytvoření seznamu z iterovatelného # objektu vráceného funkcí filter() filtrovaná_čísla = list(filter(je_mensi_nez_50, čísla)) print(filtrovaná_čísla)
Výše uvedený kód vypíše následující výsledek:
[15, 46, 24, 37]
Použití cyklu for
V Pythonu je cyklus for příkaz řízení toku, který se používá pro iteraci sekvenčními datovými strukturami, jako jsou seznamy, n-tice, řetězce a pole. Cyklus for opakovaně provádí blok kódu pro každou položku v sekvenci.
Obecná syntaxe cyklu for je následující:
for prvek in iterovatelný_objekt: # Blok kódu, který se provede pro každý prvek iterovatelného objektu
prvek – proměnná představující aktuální položku zpracovávanou v dané iteraci cyklu
iterovatelný_objekt – sekvence, kterou cyklus for prochází. V tomto případě to bude seznam
Pro filtrování seznamu s použitím cyklu for musíme zadat podmínku filtrování do bloku kódu. Tímto způsobem se každá položka vyhodnotí z hlediska splnění stanovené podmínky.
Při filtrování seznamu pomocí cyklu for je také nutné vytvořit prázdný seznam, do kterého budeme ukládat hodnoty splňující danou podmínku filtrování.
Pro názornost si vyfiltrujme seznam čísel s cílem získat jen čísla menší než 50 pomocí cyklu for:
čísla = [79, 15, 92, 53, 46, 24, 81, 77, 37, 61] filtrovaná_čísla = [] for num in čísla: if num < 50: # append() se používá pro přidání čísla, které splňuje podmínku, # do seznamu filtrovaná_čísla. filtrovaná_čísla.append(num) print(filtrovaná_čísla)
Výše uvedený kód vypíše následující výsledek:
[15, 46, 24, 37]
Použití dalšího seznamu
Seznam můžeme filtrovat s pomocí jiného seznamu tak, že ověříme, zda se položka z filtrovaného seznamu nachází v seznamu druhém. Zvažme například následující dva seznamy:
písmena = ['a', 'h', 'q', 'd', 's', 'x', 'g', 'j', 'e', 'o', 'k', 'f', 'c', 'b', 'n'] samohlásky = ['a', 'e', 'i', 'o', 'u']
V uvedeném seznamu nazvaném písmena můžeme určit, které položky nejsou samohláskami, a to ověřením, zda se daná položka nachází v seznamu samohlásek, či nikoli. Pokud se položka v seznamu samohlásek neobjeví, nejedná se o samohlásku.
Tímto způsobem můžeme získat všechna písmena, která nejsou samohláskami. Provedeme to spuštěním následujícího kódu:
písmena = ['a', 'h', 'q', 'd', 's', 'x', 'g', 'j', 'e', 'o', 'k', 'f', 'c', 'b', 'n'] samohlásky = ['a', 'e', 'i', 'o', 'u'] není_samohláska = [] for letter in písmena: if letter not in samohlásky: není_samohláska.append(letter) print(není_samohláska)
Výše uvedený kód vypíše následující výstup, který obsahuje písmena, která nejsou samohláskami.
['h', 'q', 'd', 's', 'x', 'g', 'j', 'k', 'f', 'c', 'b', 'n']
Použití List Comprehension
V Pythonu nabízí „List Comprehension“ (seznamová komprehenze) stručnější a čistší syntaxi pro vytváření nových seznamů z existujících seznamů. S využitím „List Comprehension“ lze zredukovat více řádků kódu, které se používají pro vytváření nového seznamu z jiného seznamu pomocí cyklu for, na pouhý jeden řádek.
Je to dáno tím, že při použití „List Comprehension“ definujeme a přidáváme položky do nového seznamu vše najednou na jednom řádku.
Syntaxe pro „List Comprehension“ je následující:
nový_seznam = [výraz for prvek in iterovatelný_objekt if podmínka]
nový_seznam – nový seznam obsahující prvky přidané s pomocí „List Comprehension“
výraz – operace, která se aplikuje na každou položku iterovatelného objektu
prvek – název proměnné představující aktuální položku v iteraci
iterovatelný_objekt – iterovatelný objekt, ze kterého se prvky vybírají.
if podmínka – volitelná část, kde lze zadat podmínku pro filtrování prvků, aby se do nového seznamu přidaly jen ty, které danou podmínku splňují.
Pro demonstraci „List Comprehension“ v praxi a názornost, jak moc může zjednodušit proces filtrování a vytváření nových seznamů, použijeme seznam písmen a samohlásek k odfiltrování těch položek v seznamu písmen, které nejsou v seznamu samohlásek. Provedeme to spuštěním následujícího kódu:
písmena = ['a', 'h', 'q', 'd', 's', 'x', 'g', 'j', 'e', 'o', 'k', 'f', 'c', 'b', 'n'] samohlásky = ['a', 'e', 'i', 'o', 'u'] # List comprehension není_samohláska = [letter for letter in písmena if letter not in samohlásky] print(není_samohláska)
Výstup výše uvedeného kódu je následující:
['h', 'q', 'd', 's', 'x', 'g', 'j', 'k', 'f', 'c', 'b', 'n']
Výstup je stejný jako v předchozím příkladu s cyklem for pro filtrování seznamu za pomocí jiného seznamu. Dosahuje se však stejného výsledku s použitím méně řádků kódu.
Závěr
Při práci s daty v Pythonu je běžná operace filtrování dat z iterovatelných objektů, jako je například seznam. Jedná se o velmi užitečný krok v analýze a zpracování dat, protože umožňuje pracovat pouze s daty, která jsou relevantní pro prováděnou operaci nebo zpracování.
Velmi oblíbenou sekvenční datovou strukturou v Pythonu je seznam. V případě, že pracujete se seznamem a potřebujete ho filtrovat, zvažte použití jedné z metod uvedených v tomto článku.
Můžete si také přečíst o tom, jak používat funkce lambda v Pythonu s příklady.