Een deel van een sequentie selecteren met [start:stop:step]
Nu we weten hoe for door een sequentie itereert, is dit een logisch moment om te kijken hoe je een deel van zo'n sequentie kunt selecteren, zonder een loop te schrijven. Dit heet slicing en werkt op list, tuple en str.
Elk element in een sequentie heeft een index, beginnend bij 0:
letters = ["a", "b", "c", "d", "e"]
# 0 1 2 3 4
Een slice pak je met sequentie[start:stop]. start is inclusief, stop is exclusief (het element op index stop zit er dus niet bij):
letters = ["a", "b", "c", "d", "e"]
print(letters[1:3]) # ['b', 'c']
print(letters[0:2]) # ['a', 'b']
print(letters[2:5]) # ['c', 'd', 'e']
Laat je start weg, dan begint de slice bij het begin. Laat je stop weg, dan loopt de slice door tot het einde:
letters = ["a", "b", "c", "d", "e"]
print(letters[:3]) # ['a', 'b', 'c'] vanaf het begin tot index 3
print(letters[2:]) # ['c', 'd', 'e'] vanaf index 2 tot het einde
print(letters[:]) # ['a', 'b', 'c', 'd', 'e'] een kopie van de hele lijst
Een negatieve index telt vanaf het einde: -1 is het laatste element, -2 het een-na-laatste, enzovoort.
letters = ["a", "b", "c", "d", "e"]
print(letters[-1]) # 'e'
print(letters[-2]) # 'd'
print(letters[:-1]) # ['a', 'b', 'c', 'd'] alles behalve het laatste element
print(letters[-3:]) # ['c', 'd', 'e'] de laatste 3 elementen
Met sequentie[start:stop:step] bepaal je ook de stapgrootte. Een step van 2 pakt bijvoorbeeld om het element een:
getallen = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(getallen[::2]) # [0, 2, 4, 6, 8] elk tweede element
print(getallen[1::2]) # [1, 3, 5, 7, 9] elk tweede element, vanaf index 1
print(getallen[::-1]) # [9, 8, 7, ..., 0] de hele lijst omgekeerd
Veelgebruikt patroon:
lijst[::-1]is de meest gebruikte manier om een lijst (of string) om te draaien.
tekst = "Python"
print(tekst[0:2]) # 'Py'
print(tekst[-3:]) # 'hon'
print(tekst[::-1]) # 'nohtyP'
Bij directe indexering (letters[10]) krijg je een IndexError als de index niet bestaat. Bij slicing gebeurt dat niet: Python knipt gewoon af bij wat er beschikbaar is.
letters = ["a", "b", "c"]
# print(letters[10]) # FOUT! IndexError
print(letters[1:10]) # ['b', 'c'] geen fout, gewoon tot het einde
print(letters[10:20]) # [] lege lijst, geen fout