如何根据python中内部字典的键(按字母顺序)对字典中的字典进行排序

2024-09-29 02:25:01 发布

您现在位置: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})])

外部字典的关键字格式为“年”“月” 外部字典的值为{name of product:quantity}格式的字典

内部字典的关键字是产品的名称 内部字典的值是(产品的)数量

我的目标是根据最新日期(最新的为第一个)对外部词典进行排序,根据产品名称的字母顺序对内部词典进行排序。

换句话说:

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])))给出错误的结果。

enter image description here


Tags: nameinif字典orderproductordereddictwithout
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])) 

尝试以下操作(使用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)

相关问题 更多 >