Java týden Předvánoční slevová akce
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Lekce 5 - Seznamy v Pythonu, jejich základní funkce a metody

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Cykly v Pythonu, funkce range() a výraz pass, jsme si ukázali, jak používat cykly v Pythonu. V dnešním tutoriálu se podíváme na seznamy a také se naučíme různé funkce, které lze aplikovat i na jiné kolekce. O těch ale až později.

Úvod do seznamů

Představte si, že potřebujete uložit nějaké hodnoty, např. zaměstnance nějaké firmy. A těch hodnot je velké množství (např. 100 osob). Vytvářet si na každou z nich proměnnou je hotové šílenství.

Seznamy

Seznam nám poskytuje způsob, jak ukládat větší množství hodnot přehledně a na jedno místo.

Vytváření seznamů

Seznam se vytváří za pomoci hranatých závorek a jednotlivé prvky v něm oddělíme čárkou.

Příklad:

seznam_1 = []
seznam_2 = [1, 2, 3]
seznam_3 = ["a", "b", "c"]
seznam_4 = ["a", 1, "b", 2]

Seznamy můžeme vytvářet i za pomoci funkcí range() a list(). Funkce range() vrací iterátor, který je převeden na seznam pomocí funkce list. O iterátorech ale až někdy jindy :) Funkci range() jsme již probírali. Pro zopakování syntaxe:

  • range(n) - vrátí čísla od nuly do n-1
  • range(m, n) - vrátí čísla od m do n-1
  • range(m, n, i) - vrátí čísla od m a každé další i-té číslo do n-1

Pár takto vytvořených seznamů:

seznam_1 = list() #prázdný seznam
seznam_2 = list(range(3)) #[0, 1, 2]
seznam_3 = list(range(3, 7)) #[3, 4, 5, 6]
seznam_4 = list(range(1, 10, 2)) #[1, 3, 5, 7, 9]

Jednotlivé prvky

K jednotlivým prvkům seznamu lze přistupovat pomocí indexů. Číslování začíná od nuly. Každý další prvek má číslo větší o 1. To znamená, že první prvek má index 0, další 1, ještě další má index 2 atd.

Seznamy v Pythonu – Indexy

V Pythonu můžeme pro přístup k prvkům použít i záporné indexy. Ty se číslují odzadu. Tudíž poslední prvek má index -1, předposlední -2 atd. K prvkům se přistupuje přes hranaté závorky.

seznam = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

print(seznam[0])
print(seznam[1])
print(seznam[5])
print(seznam[7])
print(seznam[-1])
print(seznam[-3])
Konzolová aplikace
>>> seznam = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
>>> seznam[0]
2
>>> seznam[1]
3
>>> seznam[5]
13
>>> seznam[7]
19
>>> seznam[-1]
29
>>> seznam[-3]
19
>>>

Ořezávání

Seznamy lze i ořezávat. To znamená, že ze seznamu získáme jeho část. Syntaxe je stejná, jako v předchozím případě, až na to, že do hranaté závorky se vloží i koncový index, po případně i kolikátý prvek chceme.

Příklady:

seznam = list(range(10))
print(seznam)

print(seznam[0:5])
print(seznam[2:8])
print(seznam[1:7])
print(seznam[1:7:2])
print(seznam[2:9:2])
print(seznam[1:7:3])
Konzolová aplikace
>>> seznam = list(range(10))
>>> seznam
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> seznam[0:5]
[0, 1, 2, 3, 4]
>>> seznam[2:8]
[2, 3, 4, 5, 6, 7]
>>> seznam[1:7]
[1, 2, 3, 4, 5, 6]
>>> seznam[1:7:2]
[1, 3, 5]
>>> seznam[2:9:2]
[2, 4, 6, 8]
>>> seznam[1:7:3]
[1, 4]
>>>

Syntaxe:

  • název_seznamu[m] - vybere jediný prvek
  • název_seznamu[m:n] - vybere prvky v rozsahu mn-1
  • název_seznamu[m:n:i] - vybere m a každý i-tý prvek do n-1

Jednotlivé argumenty určující co chceme vybrat, lze i vynechat. Můžeme tedy napsat [::2] , což vám vybere každý druhý prvek v seznamu.

Pokud není zadaný první prvek, bere se od začátku seznamu (0). Není-li zadaný druhý prvek, bere se konec seznamu. A není-li zadáno o kolik prvků chceme postupovat, bere se to jako 1, tudíž se vezme každý prvek v zadaném intervalu.

Velikost seznamu

Na zjištění velikosti seznamu (či jiného iterovatelného objektu) máme k dispozici funkci len(). Ta vrací počet prvků.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Příklad:

seznam = [1, 2, 3, "a", "b"]
print(len(seznam))

Procházení seznamu

Na procházení seznamu existují tři způsoby:

1) For in

Pomocí jednoduchého cyklu for in získáme jednotlivé prvky. Bohužel je tímto způsobem nemůžeme v procházeném seznamu upravovat. Ale můžeme je například vytisknout.

Syntaxe:

seznam = [1, 2, 3]
for prvek in seznam:
    print(prvek)

Při průchodu cyklem se prvek ze seznamu uloží do proměnné prvek a my s ním můžeme něco udělat (např. vytisknout jako v ukázce). Poté se tento prvek "zahodí" a vezme se další prvek ze seznamu.

2) Pomocí funkce range()

Použijeme funkci range(), len() a cyklus for in.

Syntaxe:

seznam = [1, 2, 3]
for index in range(len(seznam)):
    seznam[index] = seznam[index] + 1
print(seznam)
for index in range(len(seznam)):
    seznam[index] = seznam[index] + 1 #všechna čísla v seznamu zvětšíme o 1

Pozor! Pokud chceme dělat to samé co v ukázce, musí být seznam pouze z čísel!

Funkce len() nám vrátí počet prvků a tento počet si převedeme na iterátor, který nám vrací indexy od prvního prvku (0) do posledního prvku (velikost seznamu - 1). Poté k prvkům přistupujeme přes indexy.

3) Pomocí funkce enumerate()

Funkce enumerate() vrací index prvku i jeho hodnotu. Za for následuje proměnná i, do které se ukládá index prvku a libovolná proměnná, do které se ukládá hodnota prvku.

Syntaxe:

seznam = [1, 2, 3]
for i, prvek in enumerate(seznam):
    print(i, prvek)
print(seznam)

Tímto způsobem získáme jak prvek, tak i jeho index :)

Metody

Metody se na rozdíl od funkcí název_funkce(název_objektu) mají tuto syntaxi: název_objektu.název_metody(parametry). Jsou to tedy funkce, které patří nějakému objektu.

V této lekci se naučíme dvě metody - append() a pop().

append

Metoda append() připojí prvek na konec seznamu.

Příklad:

seznam = [1, 2]
seznam.append(3)
print(seznam)
seznam.append(5)
print(seznam)
seznam.append(8)
print(seznam)
seznam.append(13)
print(seznam)
seznam.append(21)
print(seznam)
seznam.append(34)
print(seznam)
Konzolová aplikace
>>> seznam = [1, 2]
>>> seznam.appendlt;3>
>>> seznam
[1, 2, 3]
>>> seznam.appendlt;5>
>>> seznam
[1, 2, 3, 5]
>>> seznam.appendlt;8>
>>> seznam
[1, 2, 3, 5, 8]
>>> seznam.appendlt;13>
>>> seznam
[1, 2, 3, 5, 8, 13]
>>> seznam.appendlt;21>
>>> seznam
[1, 2, 3, 5, 8, 13, 21]
>>> seznam.appendlt;34>
>>> seznam
[1, 2, 3, 5, 8, 13, 21, 34]
>>>

pop

Metoda pop() vrátí a odstraní poslední prvek ze seznamu.

Příklad:

seznam = [1, 2, 3, 5, 8, 13, 21, 34]
seznam.pop()
print(seznam)
seznam.pop()
print(seznam)
promenna = seznam.pop()
print(promenna)
print(seznam)
seznam.pop()
print(seznam)
Konzolová aplikace
>>> seznam = [1, 2, 3, 5, 8, 13, 21, 34]
>>> seznam.pop()
34
>>> seznam
[1, 2, 3, 5, 8, 13, 21]
>>> seznam.pop()
21
>>> seznam
[1, 2, 3, 5, 8, 13]
>>> promenna = seznam.pop()
>>> promenna
13
>>> seznam
[1, 2, 3, 5, 8]
>>> seznam.pop()
8
>>> seznam
[1, 2, 3, 5]
>>>

Funkce

Všechny tyto funkce se dají použít i na jiné iterovatelné objekty, než je seznam.

len()

Vrátí počet prvků iterovatelného objektu.

Příklad:

seznam = [1, 3, 2, 0, 5]
print(len(seznam))

min()

Vrátí z iterovatelného objektu prvek s nejmenší hodnotou.

seznam = [1, 3, 2, 0, 5]
print(min(seznam))

max()

Vrátí z iterovatelného objektu prvek s největší hodnotou.

seznam = [1, 3, 2, 0, 5]
print(max(seznam))

sum()

Vrátí součet prvků v iterovatelném objektu.

seznam = [1, 3, 2, 0, 5]
print(sum(seznam))

sorted()

Seřadí prvky v iterovatelném objektu.

seznam = [1, 3, 2, 0, 5]
print(sorted(seznam))

Lze také použít metodu seznamu sort(), která seznam rovnou seřadí, jelikož funkce sorted() vrací pouze jeho seřazenou kopii a seznam zůstavá nezměněný.

all()

Vrátí booleovskou hodnotu True, jestliže se všechny prvky v iterovatelném objektu vyhodnotí na True, jinak vrátí False.

seznam_1 = [1, 3, 2, 0, 5]
seznam_2 = [6, 4, 5, 1, 2]
print(all(seznam_1))
print(all(seznam_2))

any()

Vrátí booleovskou hodnotu True, jestliže se alespoň jeden prvek v iterovatelném objektu vyhodnotí na True, jinak vrátí False.

seznam_1 = [1, 3, 2, 0, 5]
seznam_2 = [6, 4, 5, 1, 2]
seznam_3 = []
print(any(seznam_1))
print(any(seznam_2))
print(any(seznam_3))

del

Pomocí del lze jednotlivé prvky ze seznamu mazat za pomoci řezu. Příklad:

seznam = [1, 3, 2, 0, 5]
del(seznam[1])
print(seznam)
del(seznam[1:3])
print(seznam)

A to je pro tento díl vše :)

V příští lekci, Textové řetězce v Pythonu, nás čekají řetězce v Pythonu.


 

 

Aktivity (8)

 

 

Komentáře
Zobrazit starší komentáře (10)

Avatar
Nevik Qsuluqod:20.12.2015 18:43

Nemohl by si mi poradit, potřebuju vyprintovat seznam ale potřebuju aby to bylo bez hranatých závorek, obzvlášť když mám seznam v seznamu dik.

Odpovědět
20.12.2015 18:43
Je těžké naučit se HTML, všude ho učí špatně, a co itnetwork? TO JE BIBLE
Avatar
gcx11
Redaktor
Avatar
gcx11:20.12.2015 18:56

Ahoj, na to se jde pomocí rekurze.
Zjistíš zda-li je prvek seznamu seznam, pokud ano, projedeš prvky nového seznamu, pokud ne, můžeš v klidu vytisknout prvek

Pokud budeš potřebovat hezčí výstup, je lepší si pohrát s parametry funkce print

def vytiskni_vnoreny_seznam(seznam):
    for prvek in seznam:
        if isinstance(prvek, list):
            vytiskni_vnoreny_seznam(prvek)
        else:
            print(prvek)
 
Odpovědět
20.12.2015 18:56
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Nevik Qsuluqod
hanpari:20.12.2015 20:03
test = [1,2,
            [1,2,3],
            [1,2,
             [1,2,3]],
        4,5]

vysledek = str(test).replace("[","").replace("]","")
print(vysledek)
 
Odpovědět
20.12.2015 20:03
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Nevik Qsuluqod
hanpari:20.12.2015 20:07

Anebo takto pro list i tuple:

vysledek = "".join([znak for znak in str(test) if znak not in "[]()"])
 
Odpovědět
20.12.2015 20:07
Avatar
Odpovídá na hanpari
Nevik Qsuluqod:21.12.2015 0:03

dik za odpoved

Odpovědět
21.12.2015 0:03
Je těžké naučit se HTML, všude ho učí špatně, a co itnetwork? TO JE BIBLE
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Nevik Qsuluqod
hanpari:21.12.2015 14:40

Není zač, jen poznámka na okraj. Moje první řešení nepoužívej, to byla jen ukázka, zbytečně dělá totéž dvakrát. A v druhém řešení si vyhoď seznamovou komprehenzi. Je tam myslím zbytečná.

 
Odpovědět
21.12.2015 14:40
Avatar
nickname01
Člen
Avatar
nickname01:12. července 15:20

Navrhuji vyměnit následující část textu

range(m, n, i) - vrátí čísla od m a každé další i-té číslo do n-1

za toto: range(m, n, i) - vrátí čísla od m a každé další i-té číslo do n, ale nebude počítat s prvkem n

Důvod:
Původní definice je podle mě nesprávná.

list(range(5, 3, -1))

vrátí [5, 4], nikoli [5, 4, 3, 2]. To samé pro ořezávání.

Jestli se mýlím, prosím opravte mě.

 
Odpovědět
12. července 15:20
Avatar
Denisa Váňová:1. listopadu 21:32

Ahoj, pomohl by mi někdo s tímto zadáním v pythonu - uživatel zadá číslo n, program vypíše jeho zápis ve dvojkové soustavě. Moc děkuji :)

 
Odpovědět
1. listopadu 21:32
Avatar
Odpovídá na Denisa Váňová
Tomáš Sobol:2. listopadu 12:50

Ahoj, na převod čísla do binární soustavy existuje funkce bin.

bin(99)

Číslo 99 je v binární soustavě 0b1100011 a pokud chceš jenom ty čísla, tak do proměnné ulož čísla která jsou za 0b a máš to hotovo. ;-)

 
Odpovědět
2. listopadu 12:50
Avatar
Milan Turyna
Redaktor
Avatar
Milan Turyna:2. listopadu 14:51

Pokud chceš jen ty čísla jak psal Tomáš Sobol tak to se dá udělat pomocí:

bin(99)[2:]

bin(99) převede číslo (například 99) do dvojkové soustavy a [2:] udělá to, že se z výsledku odeberou první dva znaky v tomhle případě 0b.

Pokud ale budeš chtít aby uživatel zadal číslo do inputu a potom se jeho číslo dále zpracovávalo tak si na to udělej například funkci (to je jedno) a zkontroluj jestli to co zadal je opravdu číslo (integer, float myslím že nejde převést do dvojkové soustavy a nebo jde, ale bude s desetinnými čísly.).

 
Odpovědět
2. listopadu 14:51
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 20. Zobrazit vše