尽管我看到了很多有关对字典的字典进行排序的答案,但我仍无法根据问题调整解决方案。
这是我字典的结构:
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])))
我的字典是未定订单结果。
result = collections.OrderedDict(sorted(pendingOrdersResult.iteritems(), key=lambda (k, v): (pendingOrdersResult[k])))
给出错误的结果。
答案 0 :(得分:2)
听起来您需要分别在每个“内部”词典以及“外部”词典上调用sorted
函数。您还需要将内部字典转换为OrderedDict
类型,以使其可排序。这是我能想到的,但是可能会有更短/更多的惯用方式来做到这一点:
# Sort the outer dictionary by key from high to low
OrderedDict(sorted(d.items(), key=lambda t: t[0], reverse=True))
# Sort the inner dictionaries by key
for item in d.items():
d[item[0]] = OrderedDict(sorted(item[1].items(), key=lambda x: x[0]))
答案 1 :(得分:1)
尝试以下操作(经过python 3.7.1测试):
import collections
raw = dict([('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})])
data = {key : collections.OrderedDict(sorted(value.items(), key=lambda entry: entry[0])) for key, value in raw.items()}
result = collections.OrderedDict(sorted(data.items(), key = lambda entry: entry[0]))
print(result)
编辑:具有避免“ c&p”代码的功能:
import collections
def sort_dict(unsorted):
return collections.OrderedDict(sorted(unsorted.items(), key=lambda entry: entry[0]))
raw = dict([('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})])
result = sort_dict({key : sort_dict(value) for key, value in raw.items()})
print(result)