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
Temă
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