Pe scurt
Colecțiile Python pot fi combinate: o listă poate conține dicționare, iar un dicționar poate avea liste drept valori. Alegem structura după întrebările problemei. Pentru elevi cu nume și note, o listă de dicționare păstrează mai multe înregistrări ordonate; fiecare dicționar leagă câmpurile aceluiași elev.
În detaliu
Colecțiile Python se pot imbrica: o listă poate conține liste, șiruri sau dicționare, iar un dicționar poate avea liste ori alte dicționare drept valori. Alegerea structurii urmează întrebările problemei. O listă de dicționare păstrează mai multe înregistrări în ordine, iar fiecare dicționar leagă câmpurile aceluiași obiect. Un dicționar de liste grupează valori după o cheie, de exemplu notele fiecărei clase. O listă de liste reprezintă un tabel sau o matrice. Accesul la un element imbricat se face prin indici sau chei înlănțuite, de la exterior spre interior: întâi un indice de listă sau o cheie de dicționar, apoi următorul nivel. La fiecare nivel se urmărește tipul: indicele este întreg pentru liste și șiruri, iar cheia are tipul cheilor dicționarului.
Exemplul 1 — listă de dicționare.
elevi = [{"nume": "Ana", "note": [8, 10]},
{"nume": "Dan", "note": [7]}]
print(elevi[0]["nume"], sum(elevi[0]["note"]))
elevi[0] este dicționarul Anei; ["nume"] dă Ana, iar lista notelor conține 8 și 10, cu suma 18. Se afișează Ana 18. Elevii cu media cel puțin 8 se obțin printr-o parcurgere: [e["nume"] for e in elevi if sum(e["note"]) / len(e["note"]) >= 8] dă ['Ana'], pentru că media Anei este 9, iar a lui Dan este 7. Înainte de împărțire se verifică ca lista notelor să nu fie goală.
Exemplul 2 — listă de liste și de șiruri. Pentru grupe = [[2, 4], [7]], expresia grupe[0][1] este 4: primul indice alege prima listă, al doilea alege al doilea element al ei. Lista interioară grupe[1] are lungimea 1. Pentru nume = ["Ana", "Dan"], expresia nume[1][0] este D: nume[1] este șirul "Dan", iar [0] este primul lui caracter. O listă de liste cu același număr de elemente în fiecare rând reprezintă o matrice: pentru mat = [[1, 2, 3], [4, 5, 6]], mat[1][2] este 6, coloana de indice 1 este [r[1] for r in mat], adică [2, 5], iar suma tuturor elementelor este sum(sum(r) for r in mat), adică 21.
Exemplul 3 — dicționar de liste.
grupe = {"9A": [8, 9, 10], "9B": [7, 6]}
medii = {k: sum(v) / len(v) for k, v in grupe.items()}
print(medii)
Se afișează {'9A': 9.0, '9B': 6.5}. Cheia "9A" este asociată listei [8, 9, 10], cu media , iar cheia "9B" listei [7, 6], cu media . O listă adăugată sub o cheie se modifică prin grupe["9B"].append(8); obiectul modificat este lista, nu dicționarul. Dacă două chei ar indica aceeași listă, modificarea ei s-ar vedea sub ambele chei.
Atenție la crearea unei liste de liste: [[0] * 3] * 2 repetă aceeași listă interioară de două ori, deci modificarea unui element apare în ambele rânduri, pe când [[0] * 3 for _ in range(2)] creează două liste distincte.
Exemplul 4 — gruparea înregistrărilor după cheie. Lista de perechi note = [("Ana", 9), ("Dan", 7), ("Ana", 10)] se transformă într-un dicționar de liste:
d = {}
for nume, nota in note:
d.setdefault(nume, []).append(nota)
print(d)
Se afișează {'Ana': [9, 10], 'Dan': [7]}. La prima apariție a cheii, setdefault creează lista goală și o întoarce; la următoarele, întoarce lista existentă, iar append o completează. Fără setdefault, instrucțiunea d[nume].append(nota) ridică KeyError la prima notă a fiecărui elev. Ordinea cheilor este cea a primei apariții. Clasamentul după medie se obține prin sorted(d, key=lambda k: sum(d[k]) / len(d[k]), reverse=True) și dă ['Ana', 'Dan'], deoarece mediile sunt 9,5 și 7. O listă de dicționare se ordonează după un câmp cu o cheie de sortare, o funcție care primește un dicționar și întoarce valoarea comparată: pentru lista elevi din primul exemplu, sorted(elevi, key=lambda e: len(e["note"]), reverse=True)[0]["nume"] dă Ana, elevul cu cele mai multe note.
Greșeli frecvente
- Greșit:
grupe[0][1]alege al doilea element al primului nivel.Corect: primul indice alege lista exterioară, al doilea alege elementul din lista interioară. - Greșit:
nume[1][0]este primul element al listeinume.Corect: este primul caracter al șirului de pe poziția 1. - Greșit: media unei liste goale se poate calcula prin
sum(v) / len(v).Corect: lungimea 0 duce la împărțire la zero și trebuie verificată înainte.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
Documente consultate
- Programele școlare noi de informatică pentru clasele X–XII (OMEC 4370/2026, MO 591 bis/20.07.2026), CNCE, anexa 2, p. 20–21; anexa 7, p. 133; rocnee.eu
- Python Software Foundation, Python Tutorial, capitolul 5, docs.python.org/3/tutorial/datastructures.html
Desene: Redactare proprie (desen original), conform OMEC 4370/2026, anexa 2, Informatică clasa a X-a, p. 20–21; rocnee.eu
