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:

  1. 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_article1 afegint totes les unitats de tots els articles que hi ha a d_article2. Guarda aquesta funció al fitxer magatzem.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.

  2. 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_magat1 afegint totes les unitats de tots els aricles de tots els tipus d’articles, és a dir, tot l’estoc que hi ha a d_magat2 . Guarda aquesta funció al fitxer magatzem.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