![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Seznam (
Položkou seznamu může být i další seznam. Takový seznam se nazyvá vnořený seznam.
Nový seznam vytvoříme nejjednodušeji uzavřením položek do hranatých závorek:
[10, 20, 30, 40] ["spam", "bungee", "swallow"]
Prvním příkladem je seznam čtyř celých čísel. Druhým je seznam tří řetězců. Položky seznamu
nemusí být stejného typu. Následující seznam obsahuje string, float, integer a (mirabile dictu!)
["hello", 2.0, 5, [10, 20]]
Seznamu uvnitř jiného seznamu říkáme, že je vnořený.
Konečně, existuje speciální seznam, který neobsahuje žádné položky. Nazývá se prázdný seznam a značí se [ ].
Stejně jako číselná hodnota 0 a prázdný řetězec, je prázdný seznam nepravdivý v booleovských výrazech:.
>>> bool(["hello", 2.0]) True >>> bool([]) False >>>
Vytvořený seznam můžeme samozřejmě přiřadit k proměnné nebo zadat jako parametr či argument funkce.
>>> vocabulary = ["ameliorate", "castigate", "defenestrate"] >>> numbers = [17, 123] >>> empty = [] >>> print(vocabulary, numbers, empty) ['ameliorate', 'castigate', 'defenestrate'] [17, 123] []
Funkce
>>> list("osel")# typ str ['o', 's', 'e', 'l'] >>> list(b"osel")# typ bytes [111, 115, 101, 108] >>> list(("a", 5, True))# typ tuple ['a', 5, True] >>> list(range(4))# typ range [0, 1, 2, 3] >>> list({"a", 5, True})# typ set [True, 5, 'a'] >>> list({"a":2, "b":False, "c":"d"})# typ dict ['a', 'b', 'c']
Při úpravě stávajícího seznamu s výhodou použijeme komprehenci iteráblu - viz odstavec 3.5.
Syntaxe pro přístup k položkám seznamu je stejná jako syntaxe pro přístup ke znakům řetězce – pomocí hranatých závorek s indexem. Nezapomeňte, že indexy začínají nulou:
>>> nested = ["hello", 123, [10,20]] >>> print(nested[1]) 123
Jako index lze použít jakýkoli celočíselný výraz:
>>> nested[9-8]# == 1 123 >>> nested[1.0] Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: list indices must be integers
Pokusíme-li se číst nebo psát položku, která neexistuje, dostaneme chybu při běhu programu:
>>> nested[3] Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range
Má-li index zápornou hodnotu, počítá se od konce seznamu:
>>> nested[-1] [10, 20] >>> nested[-3] 'hello' >>> numbers[-4] Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: list index out of range
Pro prvek vnořeného seznamu uvedeme rovněž jeho index:
>>> nested[2][1] 20
Je obvyklé použít proměnnou jako index seznamu:
horsemen = ["war", "famine", "pestilence", "death"] i = 0# proměnná pro smyčku - počítadlo while i < 4:
Tato smyčka počítá od 0 do 4. Jakmile má proměnná hodnotu 4, podmínka nevyhoví a smyčka končí. Takže tělo smyčky je provedeno pro i = 0, 1, 2 a 3.
Při každém cyklu smyčky je proměnná
Funkce
horsemen = ["war", "famine", "pestilence", "death"] i = 0while i <len (horsemen):
Po posledním provedením těla smyčky je
I když jeden seznam může obsahovat další seznam, ten vnořený se stále počítá jako jedna položka. Délka tohoto seznamu je 4:
['spam!', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]
Traverzování i vnořeným seznamem popisuje text kap. 13.3.
U seznamu lze uplatnit stejné operace jako u řetězců - viz 6.4.1
Operátor
>>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> c = a + b >>> print( c ) [1, 2, 3, 4, 5, 6]
Podobně, operátor
>>> [0]*4 [0, 0, 0, 0] >>> [1, 2, 3]*3 [1, 2, 3, 1, 2, 3, 1, 2, 3]
První příklad opakuje [0] čtyřikrát. Druhý příklad opakuje seznam [1, 2, 3] třikrát.
Pro seznamy neexistuje modul
Metody append, extend,index , insert, clear, copy,count , pop, remove, reverse, sort, splitjsou společné pro řetězce Funkce len, max, minjsou společné pro všechny iterábly listvytvoří seznam z iteráblu
Klíčové slovo
>>> horsemen = ['war', 'famine', 'pestilence', 'death'] >>> 'pestilence'in horsemen True >>> 'debauchery'in horsemen False
Protože
Můžeme použít slovo
>>> 'debauchery'not in horsemen True
Operace s úseky, které jsme poznali u řetězců, platí také u seznamů:
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> a_list[1:3] ['b', 'c'] >>> a_list[:4] ['a', 'b', 'c', 'd'] >>> a_list[3:] ['d', 'e', 'f'] >>> a_list[:] ['a', 'b', 'c', 'd', 'e', 'f']
Na rozdíl od řetězců jsou seznamy měnitelné, což znamená, že můžeme měnit jejich položky. Použitím závorkového operátoru [ ] můžeme měnit hodnotu položek:
>>> fruit = ["banana", "apple", "quince"] >>> fruit[0] = "pear" >>> fruit[-1] = "orange" >>> print(fruit) ['pear', 'apple', 'orange']
Přiřazení hodnoty položce stringu se nazývá položkové přiřazení (item assignment). Takovéto přiřazení nejde použít u řetězců:
>>> 'TEST'[2] = 'X'Traceback (most recent call last): File "<stdin >", line 1, in <module > TypeError: 'str' object does not support item assignment
ale je podporováno u seznamu řetězců:
>>> my_list = ['T', 'E', 'S', 'T'] >>> my_list[2] = 'X' >>> my_list ['T', 'E', 'X', 'T']
Úsekovým operátorem můžeme změnit několik položek najednou:
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> a_list[1:3] = ['x', 'y'] >>> print(a_list) ['a', 'x', 'y', 'd', 'e', 'f']
Můžeme také odstranit položky ze seznamu tím, že je nahradíme prázdným seznamem:
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> a_list[1:3] = [] >>> print(a_list) ['a', 'd', 'e', 'f']
A můžeme také přidat položky do seznamu vmáčknutím do prázdného úseku v potřebném místě:
>>> a_list = ['a', 'd', 'f'] >>> a_list[1:1] = ['b', 'c'] >>> print(a_list) ['a', 'b', 'c', 'd', 'f'] >>> a_list[4:4] = ['e'] >>> print(a_list) ['a', 'b', 'c', 'd', 'e', 'f']
Použití úseků k výmazu položek je neohrabané a proto náchylné k chybám. Python poskytuje šikovnější alternativu.
Příkaz
>>> a = ['one', 'two', 'three'] >>>del a[1] >>> a ['one', 'three']
Nepřekvapí nás, že
Jako indexy pro
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f'] >>> del a_list[1:5] >>> print(a_list) ['a', 'f']
Jako obvykle, úseky vyberou všechny položky zadaného rozsahu, kromě horní meze.
Účelem kopírování je vytvoření nezávislé, autonomní kopie objektu. Tuto kopii lze provést jako mělkou (shallow) nebo důkladnou (deep).
Rozhodující vlastností kopírovaného objektu je jeho složení. Jednoprvkový objekt nebo jednoduché prvky kontejneru (list, tuple, set, dict) lze nezávisle reprodukovat jako
Za kopii nelze považovat přiřazení téhož objektu k více proměnným - viz alias.
Zdánlivou kopii neboli alias vytvoříme přiřazením téhož objektu k více jménům, což lze provést najednou v jednom řádku:
>>> a = b = [1, 2, 3] >>> id(a), id(b), id([1, 2, 3]) (59931496, 59931496, 59931400)
nebo postupně
>>> orig = [2, [True, False], "asi"]# prosté přiřazení >>> kopie = orig# kopie přiřazením (alias) >>> id(orig), id(kopie), id([2, [True, False], "asi"]) (59931464, 59931464, 59931688)
Schema vztahů může vypadat takto:
Proměnné se shodnými ID odkazují na stejný objekt. Změny objektu provedené prostřednictvím jednoho aliasu se projeví i u dalšího aliasu:
>>> b[0] = 5 >>> a [5, 2, 3]
Při mělké (shallow) kopii se v možném rozsahu vytvoří nový samostatný klon originálu. Mělkou kopii můžeme provést čtverým způsobem - například pro seznam:
>>> orig = [2, [True, False], "asi"]
Použitím vestavěné metody
>>> orig_shall_one = orig.copy()
Konverzí seznamu na entici (případně obráceně):
>>> orig_shall_two = list(orig)
Použitím úsekového operátoru:
>>> orig_shall_three = orig[:]
Použitím metody
>>> import copy >>> orig_shall_four = copy.copy(orig)
Ve všech čtyřech uvedených případech se nezávisle kopírují pouze jednoduché členy kopírovaného seznamu. Prvky vloženého seznamu jsou závisle propojeny se svým originálem:
>>> orig[2] = "yes"; orig[1][1] = 8 >>> orig_shall_three; orig [2, [True, 8], 'asi']# orig_shall_three [2, [True, 8], 'yes']# orig
Při důkladné (
Důkladnou kopclr-ii vytvoříme importovanou metodou
>>> from copy import deepcopy >>> orig_deep = deepcopy(orig) >>> orig[2] = "snad"; orig[1][1] = True >>> orig_deep; orig [2, [True, False], 'asi']# orig_deep [2, [True, True], 'snad']# orig
Interní mechanizmus smyčky for - viz kap 5.3.
Použití smyčky
fruit = ["banana", "apple", "quince"]# proveďte v IDLE for ovocein fruit:
Měnitelnost seznamu nám umožňuje při jeho procházení (traverzování) upravit každou jeho položku. Následující kód vytvoří druhé mocniny čísel od 1 do 3:
numbers = [1, 2, 3]for elemin range (len (numbers)):
Výstup v IDLE:
======== RESTART: F:/Codetest/HowTo/trump_one.py ======== 1 --> 1, 2 --> 4, 3 --> 9,
Zamyslete se nad příkazem
Funkce
>>> for index, value in enumerate(['banana', 'apple', 'pear']): ... print(index, value ) ... 0 banana 1 apple 2 pear >>>
Jiné příklady využití funkce enumerate() - viz kap. 5.7.
['spam!', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]a vytiskne délku každé položky. Co se stane, zadáme-li funkci
# zde napište zadání úlohy""" # zde překopírujte doctest úlohy """ # zde napište řešení úlohy
Podle naznačených výsledků sestavte možnou hodnotu seznamu
""" >>> a_list[3] 42 >>> a_list[6] 'Ni!' >>> len(a_list) 8 """
Podle naznačených výsledků sestavte možnou hodnotu seznamu
""" >>> b_list[1:] ['Stills', 'Nash'] >>> group = b_list + c_list >>> group[-1] 'Young' """
Podle naznačených výsledků sestavte možnou hodnotu seznamu
""" >>> 'war' in mystery_list False >>> 'peace' in mystery_list True >>> 'justice' in mystery_list True >>> 'oppression' in mystery_list False >>> 'equality' in mystery_list True """
Vytvořte funkci
""" >>> list_range(a, b, c) [5,9,13,17] """
>>> range(10, 0, -2)
Po opětovném prostudování odstavce 4.8 napište funkci
a = [1, 2, 3] b = a[:] b[0] = 5
this = ['I', 'am', 'not', 'a', 'crook'] that = ['I', 'am', 'not', 'a', 'crook'] print("Test 1: %s" % (id(this) == id(that))) that = this print("Test 2: %s" % (id(this) == id(that)))Přidejte podrobné vysvětlení výsledků.
Určete hodnoty proměnných
""" >>> 13 in junk True >>> del junk[4] >>> junk [3, 7, 9, 10, 13, 17, 21, 24, 27] >>> del junk[a:b] >>> junk [3, 7, 27] """
Nakreslete schema seznamu
""" >>> nlist[2][1] 0 >>> nlist[0][2] 17 >>> nlist[1][1] 5 """
Podle výstupu z metody
""" >>> retiazka.split() ['this', 'and', 'that'] """
def add_lists (a, b): """ >>> add_lists([1,1], [1,1]) [2, 2] >>> add_lists([1,2], [1,4]) [2, 6] >>> add_lists([1,2,1], [1,4,3]) [2, 6, 4] """
Fce
def mult_lists (a, b): """ >>> mult_lists([1,1], [1,1]) 2 >>> mult_lists([1,2], [1,4]) 9 >>> mult_lists([1,2,1], [1,4,3]) 12 """
Ověřte si, že fce
Řešení musí zajisté vyhovovat doctestům. Použije sedef replace (s, old, new): """ >>> replace ('Mississippi','i', 'I') 'MIssIssIppI' >>> s = 'I love spom! Spom is my favorite food. Spom, spom, spom, yum!' >>> replace(s, 'om', 'am') 'I love spam! Spam is my favorite food. Spam, spam, spam, yum!' >>> replace(s, 'o', 'a') 'I lave spam! Spam is my favarite faad. Spam, spam, spam, yum!' """
>>> nums = [1, 2, 3, 4] >>> [x**3 for x in nums]
>>> nums = [1, 2, 3, 4] >>> [x**2 for x in nums if x**2 != 4]
>>> nums = [1, 2, 3, 4] >>> [(x, y) for x in nums for y in nums]
>>> nums = [1, 2, 3, 4] >>> [(x, y) for x in nums for y in nums if x != y]
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |