Ce vei învăța astăzi?
În această lecție combinăm operatorii (concatenare, multiplicare) și metodele (count, index, append) clasei list într-un context real: gestiunea stocurilor și a comenzilor dintr-un lanț de magazine.
De ce combinăm operatori și metode?
Definiție: În aplicațiile reale, datele nu apar niciodată ca exercițiile izolate: un depozit ține lista produselor, un alt depozit lista comenzilor, iar programul trebuie să combine, să numere, să caute și să modifice aceste liste. Operatorii (+, *, in) rezolvă rapid operații de ansamblu, iar metodele (append, count, index, sort) rezolvă operații punctuale asupra elementelor.
Gândește-te la o firmă de curierat: are o listă de colete în depozitul central și o listă în depozitul local. Pentru a vedea stocul complet, programul le unește; pentru a vedea câte colete conțin produsul „tabletă", le numără; pentru a găsi primul colet de „tabletă", îi caută poziția.
Analogie: registrul de evidență al magazinului
- Concatenarea (+) este ca lipirea a două pagini din registrul de stocuri: obții o singură listă completă
- Multiplicarea (*) este ca duplicarea unei pagini pentru fiecare raft al magazinului
- count() este ca numărarea de câte ori apare un produs în registrul de comenzi
- index() este ca găsirea liniei unde apare prima dată un produs
Stocul complet: concatenarea listelor din două depozite
Un lanț de magazine are două depozite: fiecare ține numărul de bucăți pe care le are pentru fiecare produs. Stocul total pentru fiecare produs se obține adunând element cu element pozițiile celor două liste, iar lista completă a tuturor produselor (prima dată depozitul 1, apoi depozitul 2) se obține cu concatenarea depozit1 + depozit2.
Concatenarea păstrează ordinea: toate elementele primei liste, urmate de toate elementele celei de-a doua. Este exact comportamentul necesar unui raport de gestiune: „ce avem în total, în ordinea depozitelor".
Exemplu: stocul complet al firmei
depozit1 = [12, 8, 15, 6, 20]
depozit2 = [5, 14, 9, 18, 7]
stoc_total = depozit1 + depozit2
print("Stoc total:", stoc_total)
print("Valori in stoc:", len(stoc_total))
print("Stoc pe produs (dep1 + dep2):")
for i in range(len(depozit1)):
print(i + 1, ":", depozit1[i] + depozit2[i])
Observă: depozit1 + depozit2 creează o listă nouă cu toate valorile, în ordine. Pentru stocul pe produs, parcurgem pozițiile cu range(len(depozit1)) și adunăm valorile de pe aceeași poziție. Cele două abordări răspund la întrebări diferite!
Comenzile clienților: count și index în practică
Magazinul primește într-o zi o listă de comenzi, fiecare comanda fiind numele unui produs. Două întrebări apar constant în gestiune: de câte ori a fost comandat un produs (răspunsul: comenzi.count(produs)) și care este numărul primei comenzi care conține produsul (răspunsul: comenzi.index(produs) + 1, deoarece pozițiile încep de la 0).
count() numără toate aparițiile valorii, iar index() returnează poziția primei apariții. Ambele sunt metode ale clasei list, deci se aplică direct pe listă, fără parcurgere manuală.
Exemplu: analiza comenzilor zilnice
comenzi = ["caiet", "pix", "caiet", "ghiozdan", "pix", "caiet"]
print("Comenzi de caiete:", comenzi.count("caiet"))
print("Comenzi de pixuri:", comenzi.count("pix"))
print("Prima comanda de pix:", comenzi.index("pix") + 1)
if "ghiozdan" in comenzi:
print("Ghiozdanul a fost comandat astazi")
Observă: count() răspunde la „cât de des?", iar index() la „unde apare prima dată?". Adăugăm 1 la poziția returnată pentru a număra comenzile de la 1, nu de la 0. Verificăm cu in înainte de index(), pentru a evita o eroare dacă produsul nu există.
Exercițiu de completare 1
Completează enunțul despre gestiunea stocurilor cu cuvintele potrivite:
Stocul total al firmei se obține cu operatorul ______, care concatenează listele celor două depozite. Numărul de comenzi ale unui produs se află cu metoda ______. Poziția primei comenzi a unui produs se află cu metoda ______. Pentru a verifica dacă un produs a fost comandat, folosim operatorul ______.
Bancă de cuvinte:
Exercițiu de completare 2
Completează fragmentul de program care analizează comenzile:
Bancă de cuvinte:
Test de înțelegere
Test rapid - gestiunea stocurilor:
1. depozit1 = [10, 20] și depozit2 = [30, 40]. Ce produce depozit1 + depozit2?
2. Ce returnează comenzi.count("pix") pentru comenzi = ["pix", "caiet", "pix"]?
3. Care este numărul primei comenzi de "caiet" din lista ["pix", "caiet", "pix"]?
d1 + d2 lipește listele una după alta, iar d1[i] + d2[i] adună valorile de pe aceeași poziție. Citește cu atenție ce întrebare pune enunțul înainte de a alege operația.Aprofundare
Concatenare versus adunare pe poziții. Operatorul + lipeste listele una după alta, iar depozit1[i] + depozit2[i] adună valorile de pe aceeași poziție. Ambele sunt corecte, dar răspund la întrebări diferite: „ce conține stocul complet?" versus „câte bucăți are fiecare produs în total?". În probleme reale, citește enunțul cu atenție ca să alegi operația potrivită.
Multiplicarea listelor în gestiune. stoc * k repetă întreaga listă de k ori. O aplicare reală: dacă magazinul are 3 rafturi identice și fiecare raft are aceeași listă de prețuri, preturi * 3 generează lista completă a tuturor etichetelor. De asemenea, [0] * n creează rapid lista de frecvențe pentru numărarea comenzilor pe produse.
Cazuri particulare la count și index. index(x) produce ValueError dacă x nu există în listă, de aceea verificăm întâi cu if x in lista:. count(x) nu produce erori și returnează 0 pentru valori inexistente, deci este sigur de folosit oricând. La listele cu valori repetate, index() returnează mereu prima apariție, exact ca o căutare secvențială care se oprește la primul rezultat.
Date organizate pe produse. Dacă fiecare produs are mai multe informații (nume, preț, cantitate), folosim o listă de liste: produse = [["caiet", 3, 12], ["pix", 1, 8]]. Atunci produse[0] este toată fișa produsului, produse[0][2] este cantitatea, iar sortarea după preț se face cu produse.sort(key=lambda p: p[1]). Aici se vede puterea combinării indexării cu metodele.
Validarea datelor în aplicații reale. În gestiunea reală, comenzile pot conține produse inexistente sau cantități negative. Un program robust verifică cu in dacă produsul există în lista de produse înainte de a-l număra cu count(), evitând rapoarte eronate.
PbInfo - Stocul total al depozitelor
Enunț:
Cerință: Se citesc două liste de numere, reprezentând stocurile (în bucăți) ale unui magazin în depozitul 1 și depozitul 2. Să se afișeze lista obținută prin concatenarea celor două liste, cu operatorul +, și numărul total de valori din lista obținută.
Date de intrare:
Programul citește de la tastatură, pe două linii separate, stocurile celor două depozite, numere întregi pozitive, separate prin spații.
Date de ieșire:
Programul va afișa pe prima linie lista stocului total (elementele primei liste urmate de elementele celei de-a doua), iar pe a doua linie numărul total de valori.
Restricții și precizări:
Fiecare listă are cel mult 1000 de elemente, numere întregi pozitive.
Exemplu:
Intrare:
12 8 15 5 14 9 18
Ieșire:
12 8 15 5 14 9 18 7
Cum gândim soluția:
- Citim stocul depozitului 1 în lista a, iar stocul depozitului 2 în lista b
- Concatenăm cu
a + bși stocăm înstoc_total - Afișăm lista cu
print(*stoc_total) - Afișăm numărul total cu
len(stoc_total)
Scrie soluția în Python:
Soluție corectă:
a = list(map(int, input().split())) b = list(map(int, input().split())) stoc_total = a + b print(*stoc_total) print(len(stoc_total))
Ce învățăm: operatorul + unește listele celor două depozite într-o singură listă, iar len() ne spune câte valori conține stocul total.
PbInfo - Comenzile unui produs
Enunț:
Cerință: Se citește o listă de comenzi (nume de produse), apoi un produs p. Să se afișeze de câte ori apare produsul p în lista de comenzi și numărul primei comenzi care conține produsul p (numărătoarea începe de la 1). Dacă produsul nu apare nicio dată, să se afișeze mesajul "NU EXISTA".
Date de intrare:
Programul citește de la tastatură, pe prima linie, comenzile separate prin spații, iar pe a doua linie produsul căutat p.
Date de ieșire:
Programul va afișa pe prima linie numărul de apariții ale produsului p, iar pe a doua linie numărul primei comenzi care conține p, sau mesajul "NU EXISTA" dacă p nu apare.
Restricții și precizări:
Lista de comenzi are cel mult 1000 de elemente; numele produselor sunt formate doar din litere mici.
Exemplu:
Intrare:
caiet pix caiet ghiozdan pix caiet pix
Ieșire:
2 2
Cum gândim soluția:
- Citim comenzile în lista comenzi și produsul căutat p
- Verificăm cu
p in comenzidacă produsul există - Dacă da, afișăm
comenzi.count(p)șicomenzi.index(p) + 1 - Dacă nu, afișăm mesajul "NU EXISTA"
Scrie soluția în Python:
Soluție corectă:
comenzi = input().split()
p = input()
if p in comenzi:
print(comenzi.count(p))
print(comenzi.index(p) + 1)
else:
print("NU EXISTA")
Ce învățăm: verificăm cu in înainte de a folosi index(), pentru a evita o eroare. count() numără aparițiile, iar index() + 1 dă numărul primei comenzi, numerotat de la 1.
Exercițiul Practic: Gestiunea stocurilor și a comenzilor
Sarcini de lucru
Completează următoarele sarcini pentru a aplica operatorii și metodele clasei list într-un context real de gestiune
Sarcina 1: Stocul pe produs din două depozite
Cerință: Scrie un program care citește stocul depozitului 1 și stocul depozitului 2 (câte o listă de numere), apoi afișează pentru fiecare produs stocul total: suma valorilor de pe aceeași poziție din cele două liste.
Soluție pentru Sarcina 1:
d1 = list(map(int, input().split()))
d2 = list(map(int, input().split()))
for i in range(len(d1)):
print("Produsul", i + 1, ":", d1[i] + d2[i])
Verifică: pentru d1 = [12, 8, 15] și d2 = [5, 14, 9], afișăm 17, 22, 24. Parcurgem pozițiile cu range(len(d1)) și adunăm valorile corespunzătoare.
Sarcina 2: Cel mai comandat produs
Cerință: Scrie un program care citește o listă de comenzi (nume de produse) și afișează produsul care apare de cele mai multe ori, împreună cu numărul de comenzi. Pentru a parcurge produsele distincte, poți folosi metoda count() pentru fiecare element al listei.
Soluție pentru Sarcina 2:
comenzi = input().split()
maxim = 0
produs_max = comenzi[0]
for p in comenzi:
nr = comenzi.count(p)
if nr > maxim:
maxim = nr
produs_max = p
print(produs_max, maxim)
Verifică: pentru "caiet pix caiet ghiozdan pix caiet", afișăm caiet 3. Folosim count() pentru fiecare element și reținem produsul cu numărul maxim de comenzi.