如何根据python

时间:2019-05-21 08:06:14

标签: python django sorting dictionary

尽管我看到了很多有关对字典的字典进行排序的答案,但我仍无法根据问题调整解决方案。

这是我字典的结构:

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

enter image description here

2 个答案:

答案 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)