# PEP8 - v seznamech se na poslední pozici čárka nepíše
# správně
numbers=[10,20,5,10]# špatně
numbers=[10,20,5,10,]
Práce s prvky seznamu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# délka seznamu
len(numbers)# počet výskytu
numbers.count(10)# přístup na index
numbers[0]numbers[1]numbers[-1]# slicing
numbers[0:3]numbers[-2:]# chyba - IndexError
numbers[1000]# zjištění indexu
numbers.index(20)
# modifikace prvku na indexu
numbers[0]+=20# přidání prvku
numbers.append(99)# odebrání prvku
numbers.remove(10)# prodloužení seznamu
numbers.extend([1,2,3])# smazání prvku na indexu
delnumbers[0]# následující kód se chová jako remove
delnumbers[numbers.index(10)]numbers=[10,20,5]# odebrání posledního prvku a jeho vrácení
numbers.pop()# odebrání prvku na indexu 1 a jeho vrácení
numbers.pop(1)
Užitečné funkce (nejen) pro seznamy.
1
2
3
4
5
6
7
8
9
10
11
12
13
# maximální prvek
max(numbers)# minimální prvek
min(numbers)# vytvoření seřazeného seznamu
sorted(numbers)# součet prvků seznamu
sum(numbers)# vytvoření seznamu z řetězce, proč funguje se dozvíme později
list("123456")# chuba - int is not an iterable
list(123456)
Odbočka k řetězcům.
1
2
3
4
5
6
7
8
# seznam slov (oddělených mezerou)
"ahoj svete jak se mas".split()# seznam slov (oddělených čárkou)
"jakub,milan,petr,tomas".split(',')# vytvoření řetězce ze seznamu řetězců
" ".join(["ahoj","svete","jak","se","mas"])# co je výsledek?
" ".join("ahoj")
numbers={10,20,5,10}# vytvoření množiny ze seznamu
numbers=[10,20,5,10]numbers=set(numbers)
1
2
3
4
5
6
# počet prvků v množině
len(numbers)# testování zda má nebo nemá množina prvek
10innumbers100notinnumbers
Modifikace prvků.
1
2
3
4
5
6
7
8
9
10
11
12
# chyba - AttributeError, Set nemá metodu append
numbers.append(10)# přidání prvku probíhá skrze add
numbers.add(20)# opakované přidání nemá efekt
numbers.add(20)# odebrání prvku
numbers.remove(20)# chyba - KeyError, prvek v množině již není
numbers.remove(20)
Vytvoření prázdné množiny.
1
2
3
4
5
6
7
# pozor, vytvoří slovník!
empty={}type(empty)# toto je správný způsob
empty=set()type(empty)
Používání set().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# množina písmen z řetězce
letters=set("ahoj svete")# nelze! seznam je mutovatelný, tedy není hashovatelný, proto nemůže být prvkem množiny
lists=set([[1,2],[3,4],[1,2]])# tuple již může
tuples=set([(1,2),(3,4),(1,2)])# nelze! slovník jako celek je mutovatelný
dicts=set([{"a":1,"b":2}])# pozor zde pracujeme pouze s klíči slovníku, ty hashovatelné být musí
keys=set({"a":1,"b":2})# řetězce nejsou mutovatelné, proto jsou hashovatelné a proto mohou být v množině
strings=set(["ahoj","svete"])
Používání frozenset().
1
2
3
4
5
6
7
8
# nelze, protože množina je mutovatelná
set([set([1,2]),set([3,4])])# lze, protože frozenset není mutovatelný
set([frozenset([1,2]),frozenset([3,4])])# nelze - frozenset není mutovatelný
frozenset([1,2]).add(5)
forcharin"ahoj svete":print(char)fornumberin[10,20,5,10]:print(number)fornumberin(10,20,5,10):print(number)forpointin((10,20),(5,2),(20,30)):print(point)# použití tuple unpackingu, velice populární a čisté řešení!
forx,yin((10,20),(5,2),(20,30)):print(x,y)# zanořený unpacking
cities=[('Tokyo','JP',36.933,(35.689722,139.691667)),('Delhi NCR','IN',21.935,(28.613889,77.208889)),('Mexico City','MX',20.142,(19.433333,-99.133333))]forname,short_name,population,(latitude,longitude)incities:print(name,short_name,population,latitude,longitude)
1
2
3
# PEP8 - pojmenování nepoužité hodnoty
forx,_in((10,20),(5,2),(20,30)):print(x)
Vytvoření dvojrozměrného seznamu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
matrix=[[1,-2,5,20],[0,2,3,400],[100,2,3,4]]# problém - vytvoření matice 2x3 vyplněné nulama
matrix_zeroes=[[0]*3]*2# pozor, nastane však problém!
matrix_zeroes[0][0]=1# správně tedy, v budoucnu se dozvíme ještě elegantnější řešení
matrix_zeroes=[]for_inrange(2):matrix_zeroes.append([0]*3)matrix_zeroes[0][0]=1
Iterace přes množinu.
1
2
3
4
5
6
7
# pozor, prvky nejsou seřazené
fornumberin{10,20,5,10}:print(number)# množinu je nutné seřadit
fornumberinsorted({10,20,5,10}):print(number)
Iterace přes slovník.
1
2
3
4
5
6
7
8
9
10
11
12
13
points={"point 2":{"x":10,"y":20},"point 1":{"x":5,"y":2}}# přes klíče a hodnoty
forlabel,pointinpoints.items():print(label,point)# pouze přes klíče
forlabelinpoints.keys():print(label)# pouze přes hodnoty
forpointinpoints.values():print(point)
Použití enumerate().
1
2
3
4
5
6
# získání indexu
foridx,numberinenumerate([10,20,5,10]):print(idx,number)# jak enumerate funguje?
list(enumerate([10,20,5,10]))
Použití zip().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
names=["Lukáš Novák","Petr Novák"]salaries=[30000,20000]forname,salaryinzip(names,salaries):print(name,salary)# jak zip funguje?
list(zip(names,salaries,["Olomouc","Přerov"]))# ruzne délky nevadí
list(zip(names,salaries,["Olomouc","Přerov","Krnov"]))# použití zip pro vytvoření slovníku
dict(zip(names,salaries))
Použití reversed().
1
2
3
# iterace přes otočený seznam
fornumberinreversed([10,20,5,10]):print(number)
Použití range().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fornumberinrange(10):print(number)fornumberinrange(5,10):print(number)# lichá čísla
forodd_numberinrange(0,10,2):print(odd_number)# jak range funguje?
list(range(0,10,2))fornumberinrange(10,0,-1):print(number)fornumberinreversed(range(10)):print(number)
# PEP8 - využívejte faktu, že prázdné sekvence jsou vyhodnoceny jako False
# správně
ifnotnumbers:passifnumbers:pass# špatně
ifnotlen(numbers):passiflen(numbers):pass# PEP8 - pořadí psaní podmínek
numbers=[1,20,5,1]# správně
if10notinnumbers:print("There is no 10!")# špatně
ifnot10innumbers:print("There is no 10!")