1. díl - Kolekce v Pythonu - n-tice a seznamy

Python Kolekce Kolekce v Pythonu - n-tice a seznamy

Vítejte u první dílu o kolekcích v Pythonu. V tomto dílu prohloubíme naše znalosti o seznamech a naučíme se používat n-tice.

N-tice

Vytváření n-tic

N-tice je datový typ, jenž uchovává své prvky v určitém pořadí. Vytváří se následovně:

prazdna = ()
prazdna_2 = tuple()
jina = (1, 2, 3)
jina_2 = tuple(range(3))

N-tici vytvoříme tak, že její prvky dáme do kulatých závorek a jednotlivé prvky oddělíme čárkou. Výraz tuple() umí převést i jiné datové typy na n-tice (pokud to lze), například výsledek funkce range().

Range() a Zip()

N-tice můžeme vytvářet i za pomoci range() a zip(). Vytvoříme si například n-tici s lichými čísly:

licha = tuple(range(1, 10, 2))
suda = tuple(range(0, 10, 2))

Pokud vypíšeme n-tice, uvidíme toto:

n-tice v Pythonu

Pomocí funkce zip() se dají vytvářet n-tice, které obsahují jiné n-tice, z více iterátorů funkce range(). Zní to složitě, tak si ukážeme příklad:

Funkce zip v Pythonu

Zde se vytvořila n-tice obsahující pouze dvě n-tice. Počet vnořených n-tic je dán nejmenším počtem prvků, které vrací jedna z funkcí range() - v tomto případě druhou, jelikož:

první vrátí - 1, 2, 3, 4

druhá vrátí - 2, 5

třetí vrátí - 1, 3, 5

Nejmenší je druhá - tudíž z každé se vezmou první dva prvky a vznikne (1, 2, 1) a (2, 5, 3).

Toto je vše k funkci zip() a range().

Operátory

Jako první si ukážeme, že n-tice lze spojovat(+), replikovat(*) a testovat zda-li v nich je (není) nějaký prvek. V následujícím příkladu si vytvoříme dvě n-tice, jednu s lichými a druhou se sudými číslicemi. Obě poté spojíme.

Slučování kolekcí v Pythonu

Množiny můžeme i replikovat, což znamená že je "rozmnožíme":

>>> cisla = tuple(1, 2, 3)
>>> cisla * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)

Navíc můžeme zjistit, zda daný prvek je (není) v n-tici:

>>> cisla = tuple(1, 2, 3)
>>> 1 in cisla
True
>>> 4 in cisla
False
>>> 2 not in cisla
False
>>> 5 not in cisla
True

Ořezávání n-tice a funkce len()

Z n-tice lze extrahovat pouze určitou část n-tice. Např. budeme potřebovat jen první dva prvky. Jak na to?

Každý prvek v n-tici má své pořadové číslo (místo, kde je uložen - index). První prvek má číslo 0, další 1 atd. Prvek v n-tici zjistíme takto - název n-tice[číslo prvku] - např. n_tice[1] - prvek na druhém místě.

Příklad:

Entice v Pythonu

Počet prvků v n-tici zjistíme funkcí len(). Jelikož indexování začíná od nuly, tak poslední prvek má číslo len(název n-tice) - 1. Funkce len nám vrací celé číslo označující počet prvků.

A další příklad:

Kolekce v Pythonu

Prvky z n-tice můžeme i dostat zápornými indexy. Při záporných indexech "jede" číslování odzadu dopředu. Tudíž poslední prvek má index -1, předposlední -2 a tak dál a první prvek má index -len(název n-tice).

Příklad:

Kolekce v Pythonu

V příkladu jsem vytvořil n-tice za pomoci funkce range() :) Ořezávání ([]) můžeme použít i trochu lépe. Představte si, že byste potřebovali z n-tice dostat všechny prvky od prvního do třetího (od indexu 0 do indexu 2). Syntaxe ořezávání je podobná syntaxi funkce range():

  • n-tice[m] - vrátí z n-tice prvek s indexem m
  • n-tice[m:n] - vrátí z n-tice prvky s indexy od m do n-1
  • n-tice[m:n:i] - vrátí z n-tice prvky s indexy od m a každý další i-tý prvek až do n

m, n a i lze i vynechat. V tom případě lze např. [:] vrátit všechny prvky.

Teď pár příkladů pro přehlednost:

Příklady na kolekce v Pythonu

N-tice lze i porovnávat pomocí porovnávacích operátorů (viz 3. lekce), avšak datové typy v n-tici musejí být mezi sebou porovnatelné. Porovnávání probíhá mezi jednotlivými prvky, než je jeden z prvků na stejné indexové pozici větší (nebo menší). Tato n-tice je pak větší (nebo menší).

Metody

Metody se používají tak, že na napíšete: n-tice.metoda(pa­rametr) :) N-tice mají dvě metody: count() a index(). Metoda count(prvek) vrací počet prvků v n-tici a metoda index(prvek) vrací nejnižší nezáporný index, který obsahuje prvek.

Příklad:

n-tice v Pythonu

Toť vše k n-ticím :) Přicházejí seznamy.

Seznamy

Na seznamy můžeme použít vše, co je uvedeno výše a navíc i další funkce i metody. Seznamy se totiž od n-tic liší v tom, že na jejich konec lze přidávat prvky, jelikož seznamy nemají, na rozdíl od n-tic, pevně danou velikost. Prvky v seznamu můžeme přidávat, mazat i přepisovat. Seznam se v Pythonu vytvoří použitím hranatých závorek. Také lze převést jiný datový typ (pokud to lze) na seznam funkcí list().

Teď si ukážeme pár příkladů:

prazdny = []
prazdny_2 = list()
jiny = [1, 2, 3]
jiny_2 = list(range(3))

Přepisování prvků seznamu se provádí touto syntaxí - název seznamu[prvek] = jiný prvek.

Příklad:

Seznamy v Pythonu

Na konci jsme do seznamu vložili jiný seznam :) S prvky seznamu, můžeme pracovat i pomocí cyklů. Např chceme-li vytisknout jednotlivé prvky seznamu:

for prvek in seznam:
    print(prvek)

Chceme-li ale postupně projíždět seznam a s prvky něco dělat, je lepší syntaxe:

for index in range(len(seznam)):
    seznam[index] = #zde s jednotlivými prvky děláme, co potřebujeme

Příklad - máme pole o různých hodnotách a chceme zvětšit hodnoty např. o 1:

seznam = [1, 5, 2, 4, 6, 3]
for index in range(len(seznam)):
    seznam[index] = seznam[index] + 1

A výsledek je [2, 6, 3, 5, 7, 4] :)

Metody

Na seznamu lze provádět metody count(prvek) a index(prvek) a mnoho dalších, jež si ukážeme:

append(prvek)

Připojí na konec seznamu prvek.

clear()

Smaže všechny prvky v seznamu.

copy()

Vytvoří hlubokou kopii seznamu. Pokud například vytvoříte nový seznam tím, že na něj odkážete operátorem = (mělká kopie), tak se zkopíruje pouze odkaz na objekt. To v praxi znamená, že pokud původní seznam změníte, změní se i nově vytvořený seznam. Proměnné - ačkoliv mají jiný název vlastně ukazují na to samé :) Touto metodou vytvoříte hlubokou kopii a tedy pokud změníte původní seznam, tak zkopírovaný se vůbec nezmění.

extend()

Připojí všechny prvky z iterovatelného objektu (seznam, n-tice apod.) na konec seznamu.

insert(prvek, pozice)

Vloží prvek na danou pozici.

pop(pozice)

Vrátí hodnotu prvku na dané pozici a zároveň prvek ze seznamu odstraní. Pokud není pozice zadána, vrátí hodnotu a zároveň odstraní poslední prvek.

remove(prvek)

Odstraní prvek ze seznamu.

reverse()

Převrátí pořadí prvků v seznamu. První prvek bude poslední, druhý předposlední... a poslední bude první.

sort()

Bez argumentů seřadí prvky, které musejí být porovnatelné vzestupně. Tato metoda přijímá dva argumenty: key (funkce, přes kterou se prvky "proženou" a poté se porovnají) a reversed (pokud je nastaveno na hodnotu True, tak se seznam seřadí sestupně). Stejné klíčové argumenty má i funkce sorted().

Seznamové komprehence

Používají se pro rychlejší vytváření kolekcí. Mají tyto syntaxe:

[výraz for prvek in iterovatelný_objekt]

Vytvoří nový seznam tvořený výrazy.

[výraz for prvek in iterovatelný_objekt if podmínka]

Vytvoří nový seznam tvořený výrazy. Je-li pro daný výraz splněna podmínka, tak bude výraz v seznamu.

Příklady:

Seznamové komprehence v Pythonu

V dalším díle o kolekcích si ukážeme práci s množinami.


 

  Aktivity (1)

Článek pro vás napsal gcx11
Avatar
(^_^)

Jak se ti líbí článek?
Celkem (4 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Kolekce v Pythonu

 

 

Komentáře

Avatar
hanpari
Redaktor
Avatar
hanpari:

Moc pěkný článek.

Jen mne napadlo pár věcí na doplnění:
Tuples lze vytvářet i takto:

s = 1,2,3 #vytvoří tuple i bez závorek

Další výborná věc v pythonu

x,y,z = s # rozbalí předchozí tuple s do x,y,z

Také se mi líbí prohození proměnných:

x,y = y,x

U zazipování se hodí i rozzipování.

s = list(zip((1,2,3),(1,2,3))) # zazipujeme
s1,s2 = list(zip(*s)) # a rozzipujeme

Budu se těšit na další díl.
Pavel

PS: Jen si oprav komperhenze na komprehenze. Ono je to tak či tak hrozné slovo. :)

 
Odpovědět 7.4.2014 21:06
Avatar
Benjibs
Člen
Avatar
Benjibs:

Pekný článok :)
Len na tvorbu N-tic je iba funkcia tuple() (tvorba n-tice z iterovateľného objektu), zip() a range() sú generátorské funkcie, so samotnými n-ticami nemajú nič.

Editováno 7.4.2014 21:28
Odpovědět 7.4.2014 21:28
1 + 1 = 2
Avatar
Michal Maršálek:

Ještě bych doplnil vytvoření n-tice délky 1:

one_item_tuple = (item,)
 
Odpovědět 7.4.2014 22:42
Avatar
hanpari
Redaktor
Avatar
hanpari:

Začátečníci by si měli dát pozor na toto. Tohle může člověka překvapit :) Mne to alespoň překvapovalo :)

>>> s = list("abcd")
>>> print(s)
>>> ['a', 'b', 'c', 'd']
 
Odpovědět  +1 8.4.2014 9:05
Avatar
Pythipa
Člen
Avatar
Pythipa:

Ahoj všem a hlavně autorovi - gcx11 - a na něj otázečka: už je to rok, co zde byly poslední diskuse, a hlavně: bude nějaké pokračování seriálu Kolekce? Díky a zdraví Pythi!

 
Odpovědět 20.9.2015 11:06
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Pythipa
gcx11:

Ahoj a co bys tam rád viděl? Slovníky, něco z modulu collections a implemetaci spojovaného seznamu? Vzhledem k mému šnečímu tempu jsem chtěl ještě přidat něco o dekorátorech do OOP a pak asi něco z GUI v Pythonu. Navíc tu chybí vlákna, procesy a práce se soubory.

 
Odpovědět 20.9.2015 12:35
Avatar
joci
Člen
Avatar
Odpovídá na gcx11
joci:

A bude to este, ci uz nie ? Lebo tiez ma to zaujima.

Odpovědět 20.9.2015 15:47
Svet patrí tím, ktorí sa neposerú.
Avatar
Pythipa
Člen
Avatar
Odpovídá na gcx11
Pythipa:

Díky za odpověď.... NO,to o GUI v Pythonu by bylo skvělé, ale hlavně to o py2ece, protože to co je zde a klem na netu odkazuje na nějaké stríánky, kde se má ten exe nacházet atd., ale ani doména už neexistuje, tak jestli to vůbec ještě jde... Díky, PyPa

 
Odpovědět 20.9.2015 17:04
Avatar
Pythipa
Člen
Avatar
Odpovídá na gcx11
Pythipa:

Díky, kouknu a zkusím, PyPa

 
Odpovědět  +1 20.9.2015 18:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.