Несмотря на то, что я видел много ответов о сортировке словаря из словаря, я не смог настроить решение моей проблемы.
Вот структура моего словаря:
OrderedDict([('2018-11', {'NEOCATE JUNIOR WITHOUT FLAVOUR 400 gr.': 8}), ('2017-11', {'NEOCATE JUNIOR WITHOUT FLAVOUR 400 gr.': 804,'ALFAMINO 400 GR.': 4, 'Forticare Orange/Lemon 4 X125ml': 15})])
Внешний словарь имеет в качестве ключа дату в формате год-месяц. Внешний словарь имеет в качестве значения словарь в формате {'название продукта: количество}
Внутренний словарь имеет в качестве ключаназвание продукта Внутренний словарь имеет в качестве значения количество (продукта)
Моя цель состоит в том, чтобы отсортировать мой внешний словарь на основе самой последней даты (самой новой, чтобы быть первой) и моего внутреннего словаряна основе названия продукта в алфавитном порядке.
Другими словами:
OrderedDict([('2018-11', {'NEOCATE JUNIOR WITHOUT FLAVOUR 400 gr.': 8}),('2017-11',{'ALFAMINO 400 GR.': 4,'Forticare Orange/Lemon 4 X125ml': 15,'NEOCATE JUNIOR WITHOUT FLAVOUR 400 gr.': 804})])
Сначала идет дата 2018-11, «новее», чем 2017-11 и во внутреннейсловари, если у меня есть несколько записей в качестве словаря с ключом 2017-11, сначала идет ALFAMINO (начинается с A), затем Forticare (начинается с F) и т. д.
Вот мой код:
def warehouse_pending_products(request):
template_name= 'warehouse/warehouse_pending_products.html'
pendingOrdersResult={}
pendingOrdersList=Order.objects.filter(finished=0)
for order in pendingOrdersList:
orderYear=order.invoice_date.year
orderMonth=order.invoice_date.month
orderDate=str(orderYear)+'-'+str(orderMonth)
orderProductsWithoutSerials=ProductSerialNumbers.objects.filter(snumber__isnull=True).filter(order=order.id)#order_by('product__name')
if orderDate in pendingOrdersResult:
for op in orderProductsWithoutSerials:
p_name=op.product.name.encode("utf-8")
if p_name in pendingOrdersResult[orderDate]:
pendingOrdersResult[orderDate][p_name]+=1
else:
pendingOrdersResult[orderDate][p_name]=1
else:
if orderProductsWithoutSerials:
pendingOrdersResult[orderDate]={}
for op in orderProductsWithoutSerials:
p_name=op.product.name.encode("utf-8")
if p_name in pendingOrdersResult[orderDate]:
pendingOrdersResult[orderDate][p_name]+=1
else:
pendingOrdersResult[orderDate][p_name]=1
result = collections.OrderedDict(sorted(pendingOrdersResult.iteritems(), key=lambda (k, v): (pendingOrdersResult[k])))
Мой словарь - pendingOrdersResult.
result = collections.OrderedDict(sorted(pendingOrdersResult.iteritems(), key=lambda (k, v): (pendingOrdersResult[k])))
дает неправильный результат.