Slicing si Indexare Avansata
Sintaxa Slicing
Slicing-ul extrage o portiune dintr-o secventa:
secventa[start:stop:step]
- start: Index de inceput (inclusiv), default 0
- stop: Index de sfarsit (exclusiv), default len()
- step: Pasul, default 1
Slicing de Baza
numere = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [start:stop]
print(numere[2:5]) # [2, 3, 4]
print(numere[0:3]) # [0, 1, 2]
print(numere[5:10]) # [5, 6, 7, 8, 9]
# Omiterea parametrilor
print(numere[:4]) # [0, 1, 2, 3] - de la inceput
print(numere[6:]) # [6, 7, 8, 9] - pana la sfarsit
print(numere[:]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - copie
Indecsi Negativi
numere = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
print(numere[-3:]) # [7, 8, 9] - ultimele 3
print(numere[:-2]) # [0, 1, 2, 3, 4, 5, 6, 7] - fara ultimele 2
print(numere[-5:-2]) # [5, 6, 7]
Slicing cu Pas (Step)
numere = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Pas pozitiv
print(numere[::2]) # [0, 2, 4, 6, 8] - din 2 in 2
print(numere[1::2]) # [1, 3, 5, 7, 9] - impare
print(numere[::3]) # [0, 3, 6, 9] - din 3 in 3
# Pas negativ (inverseaza)
print(numere[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(numere[::-2]) # [9, 7, 5, 3, 1]
print(numere[8:2:-1]) # [8, 7, 6, 5, 4, 3]
Inversarea cu [::-1]
# Liste
numere = [1, 2, 3, 4, 5]
inversat = numere[::-1]
print(inversat) # [5, 4, 3, 2, 1]
# String-uri
text = "Python"
print(text[::-1]) # nohtyP
Slice Assignment
Slicing-ul poate fi folosit pentru a modifica portiuni din lista:
numere = [0, 1, 2, 3, 4, 5]
# Inlocuire simpla
numere[2:4] = [20, 30]
print(numere) # [0, 1, 20, 30, 4, 5]
# Inlocuire cu dimensiune diferita
numere[2:4] = [100, 200, 300, 400]
print(numere) # [0, 1, 100, 200, 300, 400, 4, 5]
# Stergere cu slice
numere[2:6] = []
print(numere) # [0, 1, 4, 5]
# Inserare la pozitie
numere[2:2] = [10, 20]
print(numere) # [0, 1, 10, 20, 4, 5]
Stergerea cu del si Slice
numere = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del numere[2:5]
print(numere) # [0, 1, 5, 6, 7, 8, 9]
del numere[::2] # Sterge elementele la indecsi pari
print(numere) # [1, 6, 8]
Slicing pe String-uri
String-urile suporta acelasi slicing ca listele:
text = "Hello, World!"
print(text[0:5]) # Hello
print(text[7:]) # World!
print(text[::2]) # Hlo ol!
print(text[::-1]) # !dlroW ,olleH
# Extragere cuvinte
print(text[:5]) # Hello
print(text[7:12]) # World
Exemple Practice
Verificare palindrom:
def este_palindrom(text):
text = text.lower().replace(" ", "")
return text == text[::-1]
print(este_palindrom("Ana")) # True
print(este_palindrom("Python")) # False
Rotire lista:
def roteste_stanga(lista, n):
return lista[n:] + lista[:n]
def roteste_dreapta(lista, n):
return lista[-n:] + lista[:-n]
numere = [1, 2, 3, 4, 5]
print(roteste_stanga(numere, 2)) # [3, 4, 5, 1, 2]
print(roteste_dreapta(numere, 2)) # [4, 5, 1, 2, 3]
Impartire in parti egale:
def imparte_lista(lista, n):
return [lista[i:i+n] for i in range(0, len(lista), n)]
numere = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(imparte_lista(numere, 3))
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
Comportament cu Indecsi Out of Range
Slicing-ul nu arunca eroare pentru indecsi invalizi:
numere = [0, 1, 2, 3, 4]
print(numere[10:20]) # [] - lista goala
print(numere[-100:2]) # [0, 1]
print(numere[2:100]) # [2, 3, 4]
# Dar indexarea simpla arunca eroare!
# numere[10] # IndexError!
Greseli Frecvente
1. Confuzie stop inclusiv/exclusiv
numere = [0, 1, 2, 3, 4]
print(numere[1:3]) # [1, 2] - nu include index 3!
2. Pas negativ fara inversare start/stop
numere = [0, 1, 2, 3, 4]
print(numere[1:4:-1]) # [] - gol! start < stop cu pas negativ
print(numere[4:1:-1]) # [4, 3, 2] - corect
3. Uitarea ca slicing creeaza copie noua
original = [1, 2, 3]
slice_copie = original[:]
slice_copie[0] = 99
print(original) # [1, 2, 3] - neschimbat
Puncte Cheie pentru Examen
[start:stop:step]- stop este exclusiv[::-1]inverseaza secventa- Indecsi negativi numara de la sfarsit
- Slicing nu arunca IndexError pentru indecsi invalizi
- Slice assignment poate modifica, insera sau sterge elemente
- Slicing creeaza o copie noua (shallow)
Intrebari de Verificare
- Ce returneaza
[0,1,2,3,4][1:4:2]? - Ce returneaza
"abcdef"[::-2]? - Ce returneaza
[0,1,2][10:20]? - Cum inversezi o lista folosind slicing?