Python中的按值对嵌套字典进行排序,并按照另一个值进行剩余排序

2024-04-25 12:32:41 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一下这个字典格式。

{'KEY1':{'name':'google','date':20100701,'downloads':0},
 'KEY2':{'name':'chrome','date':20071010,'downloads':0},
 'KEY3':{'name':'python','date':20100710,'downloads':100}}

我想先把字典按下载量排序,然后把所有没有下载的项目按日期排序。显然字典是不能排序的,我只需要一个排序好的键列表,我可以遍历它。

['KEY3','KEY1','KEY2']

我已经可以使用sorted按任意一个值对列表进行排序,但是如何也按第二个值排序呢?


Tags: 项目name列表date字典排序downloads格式
3条回答

可以将key函数传递给sorted,该函数返回一个元组,其中包含要排序的两个对象。假设您的大字典名为d

def keyfunc(tup):
    key, d = tup
    return d["downloads"], d["date"]

items = sorted(d.items(), key = keyfunc)

如果你愿意的话,可以用lambda来实现,但这可能更清楚。下面是等效的基于lambda的代码:

items = sorted(d.items(), key = lambda tup: (tup[1]["downloads"], tup[1]["date"]))

顺便说一下,由于您提到要首先按“下载”排序,所以上面两个示例按下载计数按升序排序。但是,从上下文来看,您可能希望按下载的降序排序,在这种情况下,您会说

return -d["downloads"], d["date"]

在你的keyfunc里。如果您想要按升序对非零下载号码进行排序,然后在这之后拥有所有零下载记录,您可以这样说

return (-d["downloads"] or sys.maxint), d["date"]

我的另一个答案是错误的(这里的大多数答案都是错误的)

sorted_keys = sorted((key for key in outer_dict if outer_dict[key]['downloads']),
                     key=lambda x: (outer_dict[key]['downloads'],
                                    outer_dict[key]['downloads'])
                     reverse=True)

sorted_keys += sorted((key for key in outer_dict if not outer_dict[key]['downloads']),
                      key=lambda x: outer_dict[key]['date'])

这将创建一个列表,其中已下载的项目按降序排列在其前面,其余未下载的项目按日期排序在已下载的项目之后。

但实际上,Eli Courtwrights answer的最后一部分是最好的。

sorted()使用key参数。它允许您指定一个函数,在给定要排序的实际项的情况下,该函数返回一个应按其排序的值。如果这个值是一个元组,那么它的排序就像元组排序一样-先按第一个值排序,然后按第二个值排序。

sorted(your_list, key=lambda x: (your_dict[x]['downloads'], your_dict[x]['date']))

相关问题 更多 >