Dicționare
Dicționarul (dictionary) în limbajul Python stochează o colecție de elemente, unde fiecare element are o cheie unică și o valoare asociată acesteia.
Definiția dicționarului are următoarea sintaxă:
dictionary = { cheie1:valoare1, cheie2:valoare2, ....}
În acolade, separate prin virgulă, se definește o secvență de elemente, unde pentru fiecare element se specifică mai întâi cheia și prin două puncte valoarea sa.
Definim un dicționar:
users = {1: "Tom", 2: "Bob", 3: "Bill"}
În dicționarul users, ca și chei sunt utilizate numere, iar ca valori - șiruri de caractere. Adică, elementul cu cheia 1 are valoarea "Tom", elementul cu cheia 2 - valoarea "Bob" și așa mai departe.
Un alt exemplu:
emails = {"tom@gmail.com": "Tom", "bob@gmai.com": "Bob", "sam@gmail.com": "Sam"}
În dicționarul emails, ca și chei sunt utilizate șiruri de caractere - adresele electronice ale utilizatorilor și ca valori tot șiruri de caractere - numele utilizatorilor.
Dar nu este obligatoriu ca cheile și valorile să fie de același tip. Ele pot reprezenta tipuri diferite:
objects = {1: "Tom", "2": True, 3: 100.6}
De asemenea, putem defini un dicționar gol fără elemente:
objects = {}
sau astfel:
objects = dict()
Transformarea listelor și a tuple-urilor în dicționar
Deși dicționarul și lista sunt tipuri diferite ca structură, totuși există posibilitatea pentru anumite tipuri de liste de a le transforma în dicționar cu ajutorul funcției integrate dict(). Pentru aceasta, lista trebuie să conțină un set de liste imbricate. Fiecare listă imbricată trebuie să constea din două elemente - la conversia în dicționar, primul element va deveni cheia, iar al doilea - valoarea:
users_list = [
["+111123455", "Tom"],
["+384767557", "Bob"],
["+958758767", "Alice"]
]
users_dict = dict(users_list)
print(users_dict) # {"+111123455": "Tom", "+384767557": "Bob", "+958758767": "Alice"}
În mod similar, putem transforma în dicționar tuple-uri bidimensionale, care la rândul lor conțin tuple-uri de două elemente:
users_tuple = (
("+111123455", "Tom"),
("+384767557", "Bob"),
("+958758767", "Alice")
)
users_dict = dict(users_tuple)
print(users_dict)
Obținerea și modificarea elementelor
Pentru a accesa elementele dicționarului, după numele acestuia se specifică cheia elementului între paranteze pătrate:
dictionary[cheie]
De exemplu, vom obține și modifica elemente în dicționar:
users = {
"+11111111": "Tom",
"+33333333": "Bob",
"+55555555": "Alice"
}
print(users["+11111111"]) # Tom
users["+33333333"] = "Bob Smith"
print(users["+33333333"]) # Bob Smith
Dacă la setarea valorii, elementul cu acea cheie nu se află în dicționar, acesta va fi adăugat:
users["+4444444"] = "Sam"
Dar dacă încercăm să obținem valoarea unei chei care nu există în dicționar, Python va genera o eroare KeyError:
user = users["+4444444"] # KeyError
Pentru a evita această situație, înainte de a accesa elementul, putem verifica existența cheii în dicționar cu ajutorul expresiei cheie in dicționar. Dacă cheia se află în dicționar, această expresie returnează True:
key = "+4444444"
if key in users:
user = users[key]
print(user)
else:
print("Elementul nu a fost găsit")
De asemenea, pentru a obține elementele putem utiliza metoda get, care are două forme:
- get(key): returnează din dicționar elementul cu cheia key. Dacă elementul cu acea cheie nu există, returnează valoarea None
- get(key, default): returnează din dicționar elementul cu cheia key. Dacă elementul cu acea cheie nu există, returnează valoarea implicită default
users = {
"+11111111": "Tom",
"+33333333": "Bob",
"+55555555": "Alice"
}
user1 = users.get("+55555555")
print(user1) # Alice
user2 = users.get("+33333333", "Unknown user")
print(user2) # Bob
user3 = users.get("+44444444", "Unknown user")
print(user3) # Unknown user
Ștergerea prin cheie
Pentru a șterge un element prin cheie, se folosește operatorul del:
users = {
"+11111111": "Tom",
"+33333333": "Bob",
"+55555555": "Alice"
}
del users["+55555555"]
print(users) # { "+11111111": "Tom", "+33333333": "Bob"}
Dar trebuie să ținem cont că, dacă o astfel de cheie nu se află în dicționar, va fi generată o excepție KeyError. Prin urmare, din nou, înainte de ștergere, este recomandat să verificăm existența elementului cu acea cheie.
users = {
"+11111111": "Tom",
"+33333333": "Bob",
"+55555555": "Alice"
}
key = "+55555555"
if key in users:
del users[key]
print(f"Elementul cu cheia {key} a fost șters")
else:
print("Elementul nu a fost găsit")
O altă metodă de ștergere este reprezentată de metoda pop(). Ea are două forme:
- pop(key): șterge elementul cu cheia key și returnează elementul șters. Dacă elementul cu acea cheie nu există, este generată excepția KeyError
- pop(key, default): șterge elementul cu cheia key și returnează elementul șters. Dacă elementul cu acea cheie nu există, returnează valoarea default
users = {
"+11111111": "Tom",
"+33333333": "Bob",
"+55555555": "Alice"
}
key = "+55555555"
user = users.pop(key)
print(user) # Alice
user = users.pop("+4444444", "Unknown user")
print(user) # Unknown user
Dacă este necesar să ștergem toate elementele, în acest caz putem folosi metoda clear():
users.clear()
Copierea și unirea dicționarelor
Metoda copy() copiază conținutul dicționarului, returnând un nou dicționar:
users = {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"}
students = users.copy()
print(students) # {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"}
Metoda update() unește două dicționare:
users = {"+1111111": "Tom", "+3333333": "Bob"}
users2 = {"+2222222": "Sam", "+6666666": "Kate"}
users.update(users2)
print(users) # {"+1111111": "Tom", "+3333333": "Bob", "+2222222": "Sam", "+6666666": "Kate"}
print(users2) # {"+2222222": "Sam", "+6666666": "Kate"}
În acest caz, dicționarul users2 rămâne neschimbat. Doar dicționarul users se modifică, în el fiind adăugate elementele celuilalt dicționar. Dar dacă este necesar ca ambele dicționare să rămână neatinse, iar rezultatul unirii să fie un al treilea dicționar, putem copia unul din dicționare în altul:
users3 = users.copy()
users3.update(users2)
Parcurgerea dicționarului
Pentru parcurgerea dicționarului putem folosi ciclul for:
users = {
"+11111111": "Tom",
"+33333333": "Bob",
"+55555555": "Alice"
}
for key in users:
print(f"Phone: {key} User: {users[key]} ")
La parcurgerea elementelor obținem cheia elementului curent și prin aceasta putem obține elementul propriu-zis.
O altă metodă de parcurgere a elementelor este utilizarea metodei items():
users = {
"+11111111": "Tom",
"+33333333": "Bob",
"+55555555":
"Alice"
}
for key, value in users.items():
print(f"Phone: {key} User: {value} ")
Metoda items() returnează un set de tuple-uri. Fiecare tuple conține cheia și valoarea elementului, pe care le putem obține în variabilele key și value.
Există de asemenea și posibilități de parcurgere a cheilor și a valorilor separat. Pentru parcurgerea cheilor putem apela metoda keys() a dicționarului:
for key in users.keys():
print(key)
De fapt, acest mod de parcurgere nu are rost, deoarece și fără apelul metodei keys() putem parcurge cheile, așa cum am arătat mai sus.
Pentru parcurgerea doar a valorilor putem apela metoda values() a dicționarului:
for value in users.values():
print(value)
Dicționare complexe
Pe lângă obiectele simple precum numere și șiruri de caractere, dicționarele pot stoca și obiecte mai complexe - cum ar fi liste, tuple-uri sau alte dicționare:
users = {
"Tom": {
"phone": "+971478745",
"email": "tom12@gmail.com"
},
"Bob": {
"phone": "+876390444",
"email": "bob@gmail.com",
"skype": "bob123"
}
}
În acest caz, valoarea fiecărui element al dicționarului reprezintă la rândul său un alt dicționar.
Pentru a accesa elementele unui dicționar imbricat, trebuie să folosim două chei:
old_email = users["Tom"]["email"]
users["Tom"]["email"] = "supertom@gmail.com"
print(users["Tom"]) # { phone": "+971478745", "email": "supertom@gmail.com }
Dar dacă încercăm să obținem valoarea pentru o cheie care lipsește în dicționar, Python va genera o excepție KeyError:
tom_skype = users["Tom"]["skype"] # KeyError
Pentru a evita eroarea, putem verifica existența cheii în dicționar:
key = "skype"
if key in users["Tom"]:
print(users["Tom"]["skype"])
else:
print("skype is not found")
Sau, alternativ, putem folosi metoda get():
users = {
"Tom": {
"phone": "+971478745",
"email": "tom12@gmail.com"
}
}
tom_skype = users["Tom"].get("skype", "Undefined")
print(tom_skype) # Undefined