簡體   English   中英

如何根據Python中內部字典的鍵(按字母順序)對字典內的字典進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM