3. Magatzem (4 punts)¶
Els magatzems de roba d’una cadena tenen guardat l’estoc en un diccionari de diccionaris. Les claus del diccionari són strings que representen cada un dels tipus d’articles que ven (“pantalons”, “camisa”, …). El valor corresponent a un tipus d’article és un diccionari en el qual les claus són strings corresponents als codis de cada producte i els valors són llistes de tres tuples de manera que cada tuple està formada per un string (la talla, que pot ser “L”, “M” o “S”) i un enter (el nombre d’unitats d’aquest producte en aquesta talla). En aquesta llista, la talla “L” ocupa la posició 0, la talla “M”, la posició 1 i “S”, la posició 2.
Observem com es guarda la informació d’un magatzem
>>> d_m1={'pantalons':{'XD45':[('L', 67), ('M', 123), ('S', 34)],
... 'RTE34':[('L', 56), ('M', 103), ('S', 54)]},
... 'camisa': {'C342':[('L', 7), ('M', 78), ('S', 4)],
... 'CTE34':[('L', 36), ('M', 73), ('S', 34)],
... 'CR4532':[('L', 7), ('M', 78), ('S', 4)]}}
L’objectiu d’aquest exercici és implementar una funció que permeti fusionar els estocs de dos magatzems. Això ho farem a partir de les dues funcions següents:
Donats dos diccionaris com els que estan associats a un article (amb claus corresponents a codis de productes i valor llista de tres elements corresponents a les unitats que hi ha de talla “L”, “M” o “S”, respectivament) implementeu una funció modificadora amb nom:
- fusiona_article(d_article1, d_article2)¶
tal que modifica
d_article1afegint totes les unitats de tots els articles que hi ha ad_article2. Guarda aquesta funció al fitxermagatzem.py.La funció ha de passar el següent doctest:
>>> d1={'XD45':[('L', 67), ('M', 123), ('S', 34)], ... 'RTE34':[('L', 56), ('M', 103), ('S', 54)]} >>> r=fusiona_article(d1, {}) >>> r==None and d1=={'XD45':[('L', 67), ('M', 123), ('S', 34)],'RTE34':[('L', 56), ('M', 103), ('S', 54)]} True >>> d2= {'XD45':[('L', 7), ('M', 33), ('S', 84)], ... 'TSD34':[('L', 56), ('M', 103), ('S', 54)]} >>> fusiona_article(d1, d2) >>> if d1 != {'XD45':[('L', 74), ('M', 156), ('S', 118)], ... 'RTE34':[('L', 56), ('M', 103), ('S', 54)],'TSD34':[('L', 56), ... ('M', 103), ('S', 54)]}: ... print (d1) >>> d3 = {'C342':[('L', 7), ('M', 78), ('S', 4)], ... 'CTE34':[('L', 36), ('M', 73), ('S', 34)], ... 'CR4532':[('L', 7), ('M', 78), ('S', 4)]} >>> fusiona_article(d1, d3) >>> if d1!={'XD45': [('L', 74), ('M', 156), ('S', 118)], ... 'RTE34': [('L', 56), ('M', 103), ('S', 54)], ... 'TSD34': [('L', 56), ('M', 103), ('S', 54)], ... 'C342': [('L', 7), ('M', 78), ('S', 4)], ... 'CTE34': [('L', 36), ('M', 73), ('S', 34)], ... 'CR4532': [('L', 7), ('M', 78), ('S', 4)]}: ... print (d1) >>> d4={'C342':[('L', 3), ('M', 3), ('S', 3)]} >>> fusiona_article(d1, d4) >>> if d1!={'XD45': [('L', 74), ('M', 156), ('S', 118)], ... 'RTE34': [('L', 56), ('M', 103), ('S', 54)], ... 'TSD34': [('L', 56), ('M', 103), ('S', 54)], ... 'C342': [('L', 10), ('M', 81), ('S', 7)], ... 'CTE34': [('L', 36), ('M', 73), ('S', 34)], ... 'CR4532': [('L', 7), ('M', 78), ('S', 4)]}: ... print (d1)
Pots descarregar el fitxer amb tests
test-article.txt.Utilitzant aquesta funció, implementa una altra funció modificadora que donats dos diccionaris que contenen l’estoc de dos magatzems modifiqui el primer afegint-hi el contingut de l’estoc del segon. La funció tindrà la següent capçalera
- fusiona(d_magat1, d_magat2)¶
En aquest cas, la funció modificarà
d_magat1afegint totes les unitats de tots els aricles de tots els tipus d’articles, és a dir, tot l’estoc que hi ha ad_magat2. Guarda aquesta funció al fitxermagatzem.py.La funció ha de passar el següent doctest:
>>> d_m1={'pantalons':{'XD45':[('L', 67), ('M', 123), ('S', 34)], ... 'RTE34':[('L', 56), ('M', 103), ('S', 54)]}, ... 'camisa': {'C342':[('L', 7), ('M', 78), ('S', 4)], ... 'CTE34':[('L', 36), ('M', 73), ('S', 34)], ... 'CR4532':[('L', 7), ('M', 78), ('S', 4)]}} >>> d_m0=d_m1.copy() >>> d_m2={'pantalons':{'XD45':[('L', 7), ('M', 13), ('S', 4)], ... 'RTE34':[('L', 10), ('M', 10), ('S', 5)], ... 'TSD34':[('L', 6), ('M', 7), ('S', 4)]}, ... 'camisa': {'C342':[('L', 7), ('M', 78), ('S', 4)], ... 'CTE34':[('L', 3), ('M', 10), ('S', 4)], ... 'CPTR99':[('L', 7), ('M', 11), ('S', 4)]}, ... 'faldilla':{'Rt99':[('L', 5), ('M', 2), ('S', 1)]}} >>> r=fusiona(d_m1, {}) >>> r==None and d_m1==d_m0 True >>> fusiona(d_m1, d_m2) >>> if d_m1 !={'pantalons': {'XD45': [('L', 74), ('M', 136), ('S', 38)], ... 'RTE34': [('L', 66), ('M', 113), ('S', 59)], 'TSD34': [('L', 6), ('M', 7), ... ('S', 4)]}, 'camisa': {'C342': [('L', 14), ('M', 156), ('S', 8)], ... 'CTE34': [('L', 39), ('M', 83), ('S', 38)], 'CR4532': [('L', 7), ('M', 78), ... ('S', 4)], 'CPTR99': [('L', 7), ('M', 11), ('S', 4)]}, ... 'faldilla': {'Rt99': [('L', 5), ('M', 2), ('S', 1)]}}: ... print (d_m1) >>> if d_m1['pantalons']!= {'XD45': [('L', 74), ('M', 136), ('S', 38)], ... 'RTE34': [('L', 66), ('M', 113), ('S', 59)], ... 'TSD34': [('L', 6), ('M', 7), ('S', 4)]}: ... print (d_m1['pantalons']) >>> l=list(d_m1.keys()) >>> l.sort() >>> l ['camisa', 'faldilla', 'pantalons']
Nota
Pots descarregar el fitxer amb tests test-magatzem.txt i una solució de magatzem.py