Lekce 2 - Tuples a množiny v Pythonu
V předchozí lekci, Úvod do kolekcí v Pythonu, jsme zjistili, jaké jsou v Pythonu kolekce.
V tomto tutoriálu kolekcí v Pythonu se zaměříme na tuples a množiny. Vysvětlíme si, k čemu se používají a čím se od sebe liší. Popíšeme si také základní metody, které k práci s těmito kolekcemi budeme používat.
Tuples v Pythonu
Tuples (někdy též uspořádané n-tice) se velmi podobají seznamům. Jedná se o sekvence, ve kterých ale položky nelze dále modifikovat. Jednotlivé položky se oddělují čárkou. Deklarujeme je pomocí kulatých závorek:
znamky = (1, 2, 3, 5)
print(znamky)
Výstup:
Konzolová aplikace
(1, 2, 3, 5)
Je tu ale malý háček v případě, že chceme deklarovat
tuple
s jedinou položkou. Abychom ji odlišili od běžné hodnoty
proměnné, musíme za položkou napsat čárku (,
):
znamka = (1)
znamky = (1,)
print(znamka)
print(znamky)
Výstup:
Konzolová aplikace
1
(1,)
Kolekci tuple
používáme, když potřebujeme někde předat
sekvenci a chceme se ujistit, že se náhodou nezmění.
Tuples
jsou read-only, takže pokud potřebujeme
tuple
z nějakého důvodu modifikovat, musíme vytvořit novou s
takovými položkami, které zrovna potřebujeme. Toho dosáhneme například
převodem tuple
na seznam a zase zpět:
znamky = (1, 2, 3, 5)
print(znamky)
znamky_seznam = list(znamky)
znamky_seznam[1] = 4
znamky = tuple(znamky_seznam)
print(znamky)
Výstup:
Konzolová aplikace
(1, 2, 3, 5)
(1, 4, 3, 5)
V kódu je důležitá metoda tuple()
která na
tuple
převádí jiné sekvence. N-tice mohou být také
sloučeny do sebe prostřednictvím operátoru +
. Toto platí pro
jakýkoliv typ sekvence:
znamky_leden = (1, 1, 4, 2)
znamky_unor = (5, 3, 1)
znamky = znamky_leden + znamky_unor
print(znamky)
Výsledek:
Konzolová aplikace
(1, 1, 4, 2, 5, 3, 1)
Totéž platí pro seznamy. Nelze však kombinovat seznamy a n-tice bez explicitního převodu na stejný datový typ.
Ke zjištění, kolik položek naše tuple
obsahuje, použijeme
globální funkci len()
. Můžeme použít i funkce
min()
a max()
pro určení nejnižší a nejvyšší
hodnoty (prostě jako u každé sekvence v Pythonu). Můžeme také použít
operátor in
, cyklus for
, operátor []
pro indexy atd.
Množiny v Pythonu
Množina neboli set
je druh sekvence podobné seznamu s tím
rozdílem, že může obsahovat jen unikátní položky (každá položka může
být v množině pouze jednou). Což také odpovídá
matematické definici pro množiny. Tyto položky nejsou
setříděné, což znamená že pořadí položek není udržováno a
může se nepředvídatelně změnit. Pro množiny není žádná zvláštní
syntaxe jako v případě seznamů či n-tic, vytváříme je
jednoduše použitím globální funkce set()
, které do parametru
vložíme sekvenci (i již existující):
planety = set(("Země", "Mars", "Jupiter", "Saturn", "Uran", "Neptun"))
print(planety)
planety.add("Pluto")
print(planety)
planety.add("Neptun")
print(planety)
Ve výstupu dostaneme:
Konzolová aplikace
{'Jupiter', 'Uran', 'Saturn', 'Mars', 'Neptun', 'Země'}
{'Jupiter', 'Uran', 'Saturn', 'Mars', 'Neptun', 'Země', 'Pluto'}
{'Jupiter', 'Uran', 'Saturn', 'Mars', 'Neptun', 'Země', 'Pluto'}
V ukázce výše jsme vytvořili množinu šesti jmen planet. Dvojité
závorky na řádku s funkcí set()
znamenají, že jsme předali
názvy planet formou n-tice jako parametr této
funkci. Pořadí položek není seřazeno podle abecedy, a nezmění se
ani po přidání nové položky. To ale není žádná chyba, neboť položky
jsou vnitřně udržovány v pořadí, což pomáhá množině efektivně určit
jedinečnost každé položky.
Metody množin
Podívejme se na základní metody pro operace s množinami.
Metoda add()
Pomocí metody add()
přidáváme položky do množiny. Z
předchozího příkladu je zřejmé, že pokud se pokusíme přidat do množiny
již jednou obsažený prvek, nevyskočí žádná chyba, ale položka
prostě není přidána:
jmena = set(("Karel", "Lida", "Alzbeta"))
jmena.add("Ivo")
jmena.add("Karel")
print(jmena)
Výstup:
Konzolová aplikace
{'Karel', 'Lida', 'Alzbeta', 'Ivo'}
Metody difference()
a difference_update()
Jak se dalo čekat, množina poskytuje všechny množinové operace, které
známe z matematických tříd. Můžeme se třeba zeptat na rozdíl mezi dvěma
množinami. Metoda difference()
vrací tento rozdíl dvou množin
jako novou množinu. Metoda difference_update()
naproti tomu
upravuje stávající množinu a odstraní všechny položky z druhé
množiny:
losovani_jedna = {1, 2, 3, 4}
losovani_dva = {3, 4, 5, 6}
rozdil = losovani_jedna.difference(losovani_dva)
print(rozdil)
losovani_jedna.difference_update(losovani_dva)
print(losovani_jedna)
Výstup:
Konzolová aplikace
{1, 2}
{1, 2}
Metody remove()
,
discard()
, a pop()
Všechny z těchto tří metod odstraní vybranou položku z
množiny. Metoda remove()
vyhodí chybu, pokud se hledaná položka
v množině nevyskytuje. Metoda discard()
se chová zcela
totožně, jen při absenci položky zamýšlené k odstranění chybu
nevyvolá. Metoda pop()
pak vyjme náhodnou hodnotu z množiny a tu
potom vrátí:
losovani = {5, 10, 15, 20}
losovani.remove(10)
losovani.discard(10) # nevyvolá chybu, přestože hodnota 10 už v množině není
print(losovani.pop())
print(losovani)
Výstup:
Konzolová aplikace
20
{5, 15}
Metoda intersection()
Tato metoda nám vypočítá průnik dvou množin:
losovani_jedna = {1, 2, 3, 4, 5}
losovani_dva = {3, 4, 5, 6, 7}
spolecne_prvky = losovani_jedna.intersection(losovani_dva)
print(spolecne_prvky)
Výstup:
Konzolová aplikace
{3, 4, 5}
Metoda isdisjoint()
Určuje, zda dvě množiny nemají žádné společné položky (průnik):
losovani_jedna = {1, 2, 3, 4, 5}
losovani_dva = {6, 7, 8, 9, 10}
vysledek = losovani_jedna.isdisjoint(losovani_dva)
print(vysledek)
Výstup:
Konzolová aplikace
True
Metody issubset()
a
issuperset()
Můžeme se zeptat, zda je množina podmnožinou (všechny její položky
jsou přítomny v druhé množině) nebo nadmnožinou (jsou v ní přítomny
všechny položky druhé množiny) pomocí metod issubset()
pro
podmnožinu a issuperset()
nadmnožinu:
losovani_jedna = {1, 2, 3, 4}
losovani_dva = {2, 3, 4, 5}
vysledek_subset = losovani_jedna.issubset(losovani_dva)
print(vysledek_subset)
vysledek_superset = losovani_jedna.issuperset(losovani_dva)
print(vysledek_superset)
Výstup:
Konzolová aplikace
False
False
Metoda clear()
Tato metoda odstraní všechny položky z množiny (vyčistí ji):
losovani_jedna = {1, 2, 3, 4, 5, 6}
losovani_jedna.clear()
print(losovani_jedna)
Výstup:
Konzolová aplikace
set()
V příští lekci, Slovníky v Pythonu, se podíváme na slovníky.