Q:

COMO ACTUALIZAR UN DICCIONARIO EN PYTHON

tengo un problema en un código que estoy creando. Me piden lo siguiente:
Si el producto no existe en el almacén o existe pero no en la cantidad suficiente, la función no realizará ninguna acción. Si el producto existe, pero el número de unidades en el almacén es igual al número de unidades a eliminar, se eliminará por completo el producto del almacén. Si el producto existe y las unidades son mayores a las unidades a eliminar, se hará la diferencia y se actualizara el diccionario con las unidades que quedan.
Mi funcion se llama: 
remove_product(store, id_product, unidades_a_reducir):

El store es el siguiente diccionario:
{'P01': {(1, 1): 52, (3, 2): 52, (2, 2): 52},
 'P02': {(1, 1): 1, (1, 2): 20, (2, 1): 4},
 'P03': {(1, 1): 7, (1, 2): 14, (2, 3): 100},
 'P05': {(2, 3): 20},
 'P04': {(2, 1): 4}}

EL cual lleva la siguiente estructura:
{'id_product': {(fila, columna): unidades}}

Para calcular el numero de unidades que tengo de cada producto hice la siguiente funcion:
def stock_product(store, id_product): #calcula el numero de unidades de cada producto
    if id_product in store:
        stock = store[id_product]
        stock_unidades = stock.values()
        return sum(stock_unidades)

No se como puedo actualizar el diccionario (store) cuando le reste unidades o elimine el producto en la funcion que tengo que crear.
remove_product(store, id_product, unidades_a_reducir):

A:

Si no importa de que posición se eliminen los productos la solución es relativamente sencilla:
def get_products(store, id_product, units):
    stock = stock_product(store, id_product) # Obtenemos los productos disponibles
    if stock == units: # Si hay los mimos que necesitamos eliminammos la clave
        del(store[id_product])
    elif stock > units: # Si hay mas stock de lo que necesitamos
        product = store[id_product]
        for pos, count in product.copy().items():
            units -= count
            if units == 0:
                del(product[pos])
                break
            elif units > 0:
                del(product[pos])
            else:
                product[pos] = -units
                break

Es importante el detalle for pos, count in product.copy().items(), se itera sobre una copia porque el número de items del diccionario se alteran  diccionario del producto mientras se idea sobre la vista, lo cual nunca es buena idea en cualquier iterable. 

>>> stock_product(store, "P02")
25
>>> get_products(store, "P02", 5)
>>> stock_product(store, "P02")
20
>>> store            
{'P01': {(1, 1): 52, (3, 2): 52, (2, 2): 52},
 'P02': {(1, 2): 16, (2, 1): 4},
 'P03': {(1, 1): 7, (1, 2): 14, (2, 3): 100},
 'P05': {(2, 3): 20},
 'P04': {(2, 1): 4}}

Una optimización sencilla sería eliminar primero productos de las localizaciones que tienen menos, de forma que se harían huecos en el almacén. En vez de tener tres pilas con un producto cada una es mejor tener una sola de tres productos. Implementar esto solo requiere iterar sobre el diccionario ordenado por los valores:
import operator

def get_products(store, id_product, units):
    stock = stock_product(store, id_product)
    if stock == units:
        del(store[id_product])
    elif stock > units:
        product = store[id_product]
        for pos, count in sorted(product.items(), key=operator.itemgetter(1)):
            units -= count
            if units == 0:
                del(product[pos])
                break
            elif units > 0:
                del(product[pos])
            else:
                product[pos] = -units
                break

>>> stock_product(store, "P02")
25
>>> get_products(store, "P02", 5)
>>> stock_product(store, "P02")
20
>>> store
{'P01': {(1, 1): 52, (3, 2): 52, (2, 2): 52},
 'P02': {(1, 2): 20},
 'P03': {(1, 1): 7, (1, 2): 14, (2, 3): 100},
 'P05': {(2, 3): 20},
 'P04': {(2, 1): 4}}

