Skip to content

Dicționare (Dictionaries)

Ce sunt dicționarele?

Un dicționar este o colecție de perechi cheie-valoare. Gândește-te la el ca la un dicționar real: ai un cuvânt (cheia) și definiția lui (valoarea).

  • Cheile trebuie să fie immutable (stringuri, numere, tupluri) și unice
  • Valorile pot fi de orice tip
  • Accesul la valori se realizează prin cheie (foarte rapid - O(1))
  • Păstrează ordinea inserării (din Python 3.7+)

Când sunt utile dicționarele?

  • Stocarea datelor structurate (ca un obiect JSON)
  • Maparea unei valori la alta (traduceri, configurări)
  • Numărarea aparițiilor elementelor
  • Cache/Memoizare pentru rezultate deja calculate
  • Reprezentarea relațiilor între entități

Crearea dicționarelor

# Dicționar vid
dictionar_vid = {}
dictionar_vid = dict()

# Dicționar cu elemente
student = {
    "nume": "Ana",
    "varsta": 20,
    "nota": 9.5
}

# Cu constructorul dict()
masina = dict(marca="Toyota", model="Corolla", an=2020)

# Din liste de tupluri
perechi = [("a", 1), ("b", 2), ("c", 3)]
dictionar = dict(perechi)

Accesarea și modificarea valorilor

student = {"nume": "Ana", "varsta": 20, "nota": 9.5}

# Accesare cu []
print(student["nume"])  # Ana

# Accesare cu get() - returnează None dacă cheia nu există
print(student.get("adresa"))        # None
print(student.get("adresa", "N/A")) # N/A (valoare implicită)

# Modificare
student["nota"] = 10
print(student)  # {"nume": "Ana", "varsta": 20, "nota": 10}

# Adăugare cheie nouă
student["email"] = "[email protected]"

# Ștergere
del student["varsta"]
valoare = student.pop("email")  # Șterge și returnează valoarea

Verificări

student = {"nume": "Ana", "nota": 9.5}

# Verificare cheie
print("nume" in student)   # True
print("varsta" in student) # False

# Verificare valoare
print(9.5 in student.values())  # True

Parcurgerea dicționarelor

student = {"nume": "Ana", "varsta": 20, "nota": 9.5}

# Parcurgere prin chei
for cheie in student:
    print(cheie, "->", student[cheie])

# Parcurgere prin valori
for valoare in student.values():
    print(valoare)

# Parcurgere prin perechi cheie-valoare
for cheie, valoare in student.items():
    print(f"{cheie}: {valoare}")

Metode utile pentru dicționare

Metodă Descriere
get(key, default) Returnează valoarea sau default
keys() Returnează cheile
values() Returnează valorile
items() Returnează perechile (cheie, valoare)
pop(key) Șterge și returnează valoarea
update(other) Actualizează cu alt dicționar
setdefault(key, val) Returnează valoarea sau setează default
clear() Golește dicționarul
copy() Returnează o copie

Aplicații practice cu dicționare

Numărarea aparițiilor

text = "abracadabra"
frecventa = {}
for litera in text:
    frecventa[litera] = frecventa.get(litera, 0) + 1
print(frecventa)  # {'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}

# Sau cu setdefault
frecventa = {}
for litera in text:
    frecventa.setdefault(litera, 0)
    frecventa[litera] += 1

Gruparea datelor

studenti = [
    {"nume": "Ana", "clasa": "10A"},
    {"nume": "Ion", "clasa": "10B"},
    {"nume": "Maria", "clasa": "10A"},
    {"nume": "Andrei", "clasa": "10B"},
]

pe_clase = {}
for student in studenti:
    clasa = student["clasa"]
    if clasa not in pe_clase:
        pe_clase[clasa] = []
    pe_clase[clasa].append(student["nume"])

print(pe_clase)
# {'10A': ['Ana', 'Maria'], '10B': ['Ion', 'Andrei']}

Cache simplu

Memoizarea înseamnă să păstrezi rezultatele deja calculate pentru a evita recalcularea lor:

cache = {}

def fibonacci(n):
    if n in cache:
        return cache[n]
    if n <= 1:
        return n
    rezultat = fibonacci(n-1) + fibonacci(n-2)
    cache[n] = rezultat
    return rezultat

print(fibonacci(100))  # Foarte rapid datorită cache-ului

Traduceri / Mapări

traduceri = {
    "hello": "salut",
    "world": "lume",
    "python": "python"
}

cuvant = "hello"
print(traduceri.get(cuvant, cuvant))  # salut

Dictionary comprehension

Similar cu list comprehension, poți crea dicționare într-o singură linie:

# Pătratele numerelor
patrate = {x: x**2 for x in range(1, 6)}
print(patrate)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# Filtrare
numere = {"a": 1, "b": 2, "c": 3, "d": 4}
pare = {k: v for k, v in numere.items() if v % 2 == 0}
print(pare)  # {'b': 2, 'd': 4}

# Inversare cheie-valoare
original = {"a": 1, "b": 2, "c": 3}
inversat = {v: k for k, v in original.items()}
print(inversat)  # {1: 'a', 2: 'b', 3: 'c'}

Comparație: Când să folosești ce?

Criteriu Listă Mulțime Dicționar
Ordine Da Nu Da (3.7+)
Duplicate Da Nu Chei unice
Acces Index - Cheie
Verificare apartenență O(n) - lent O(1) - rapid O(1) - rapid
Utilizare Colecții ordonate Elemente unice Perechi cheie-valoare

Exerciții

maxandap

Temă

maximpar

Proiect

Scrie un meniu de cumpărături:

  • Pe ecran se va afișa o listă de produse
  • Se va deschide un input în care utilizatorul va scrie ce produs dorește să cumpere
  • Pentru input greșit se va afișa mesaj de eroare
  • Pentru input corect, utilizatorul va fi întrebat câte produse dorește (1-100)
  • Programul se va opri la citirea inputului "exit"
  • La final se va afișa lista de cumpărături și prețul total