2.7. Seznamy¶
Seznam je měnitelná, uspořádaná posloupnost hodnot. Na rozdíl od řetězců a bytů mohou seznamy obsahovat hodnoty libovolného typu a položky můžete měnit, přidávat nebo odebírat na místě.
2.7.1. Vytváření seznamů¶
Hranaté závorky vytvoří literál seznamu:
empty = []
nums = [1, 2, 3]
mixed = [1, "two", 3.0, True, None] # any types
nested = [[1, 2], [3, 4], [5, 6]] # lists of lists
Konstruktor list vytvoří seznam z libovolného iterovatelného objektu:
>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]
2.7.2. Délka, indexování a řezy¶
len() vrací počet položek. Indexování a řezy fungují stejně jako u řetězců – pozice začínají na 0, záporné indexy se počítají od konce a řez mimo platný rozsah se tiše ořízne, místo aby vyvolal chybu:
>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Kladné indexy se počítají od začátku; záporné indexy se počítají od konce.¶
Syntaxe řezu je zkratkou pro objekt slice, který Python vytváří v zákulisí. nums[1:4] je totéž co nums[slice(1, 4)]. Ručně jej vytváříte jen zřídka, ale slice() je občas užitečný pro uložení řezu jako hodnoty k opakovanému použití:
head = slice(0, 3)
print(nums[head]) # [10, 20, 30]
print(letters[head]) # first three letters, same slice
2.7.3. Mutace seznamu¶
Seznamy podporují indexované a řezové přiřazení na místě:
>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400] # slice can change the length
>>> nums
[99, 200, 300, 400]
Nejběžnější metody seznamu:
list.append()– přidá jednu položku na konec.list.extend()– připojí každou položku z iterovatelného objektu.list.insert()– vloží na danou pozici.list.remove()– odstraní první výskyt hodnoty.list.pop()– odebere a vrátí položku (ve výchozím nastavení poslední).list.clear()– odstraní každou položku.list.sort()– seřadí na místě. Pro sestupné pořadí předejtereverse=True.list.reverse()– obrátí na místě.
>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]
Tyto metody upravují seznam na místě a vracejí None. Zápis
nums = nums.sort() # nums is now None -- common bug
téměř nikdy není to, co chcete; původní nums byl seřazen, ale přiřazení poté přepíše jméno návratovou hodnotou. Buď zavolejte nums.sort() na samostatném řádku, nebo použijte vestavěnou funkci sorted(), která vrátí nový seřazený seznam, aniž by měnila původní.
2.7.4. Operátory¶
+spojí dva seznamy do nového seznamu.*opakuje seznam.intestuje členství.
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True
2.7.5. Iterování přes seznam¶
Smyčka for projde položky v pořadí:
for n in [10, 20, 30]:
print(n)
2.7.6. Aliasování a mutace¶
Seznam je jediná hodnota v paměti; na stejný seznam může ukazovat několik jmen. Mutace přes jedno jméno je viditelná přes každé jiné jméno, které ukazuje na stejný seznam.
a a b obě ukazují na stejný seznam. Mutace přes kterékoli jméno změní to, co vidí každé jiné jméno.¶
>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4] # same object, change is visible
Chcete-li vytvořit nezávislou kopii, vytvořte řez celého seznamu nebo zavolejte konstruktor list:
>>> c = a[:] # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4] # c is unaffected
Toto zkopíruje pouze nejvyšší úroveň seznamu; vnořené seznamy jsou stále sdíleny mezi originálem a kopií.