🐍

Slicing si Indexare Avansata

Programare Python Intermediar 1 min citire 0 cuvinte

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

  1. Ce returneaza [0,1,2,3,4][1:4:2]?
  2. Ce returneaza "abcdef"[::-2]?
  3. Ce returneaza [0,1,2][10:20]?
  4. Cum inversezi o lista folosind slicing?

📚 Articole Corelate