[英]How to sort a dictionary inside a dictionary based on the key(alphabetically) of the inner dictionary in python
盡管我已經看到了很多有關對字典中的字典進行排序的答案,但我仍無法針對問題調整解決方案。
這是我字典的結構:
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])))
給出錯誤的結果。
聽起來您需要分別在每個“內部”字典以及“外部”字典上調用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]))
嘗試以下操作(經過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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.