31 python sorting dictionary python-2.5
考虑这种字典格式.
{'KEY1':{'name':'google','date':20100701,'downloads':0},
'KEY2':{'name':'chrome','date':20071010,'downloads':0},
'KEY3':{'name':'python','date':20100710,'downloads':100}}
Run Code Online (Sandbox Code Playgroud)
我希望首先按下载排序字典,然后按日期排序没有下载的所有项目.显然字典无法排序,我只需要一个可以迭代的按键排序列表.
['KEY3','KEY1','KEY2']
Run Code Online (Sandbox Code Playgroud)
我已经可以通过使用值对列表进行排序sorted
,但是如何按第二个值排序?
Amb*_*ber 46
使用key
参数sorted()
.它允许您指定一个函数,在给定实际项目排序的情况下,返回应按其排序的值.如果这个值是一个元组,那么它会像元组一样排序 - 按第一个值排序,然后按第二个值排序.
sorted(your_list, key=lambda x: (your_dict[x]['downloads'], your_dict[x]['date']))
Run Code Online (Sandbox Code Playgroud)
您可以传递一个key
函数,sorted
该函数返回一个包含您要排序的两个元素的元组.假设您的大词典被调用d
:
def keyfunc(tup):
key, d = tup
return d["downloads"], d["date"]
items = sorted(d.items(), key = keyfunc)
Run Code Online (Sandbox Code Playgroud)
lambda
如果您愿意,可以使用a来执行此操作,但这可能更清楚.这是基于lambda的等效代码:
items = sorted(d.items(), key = lambda tup: (tup[1]["downloads"], tup[1]["date"]))
Run Code Online (Sandbox Code Playgroud)
顺便提一下,由于您提到要先按"下载"排序,以上两个示例按照下载计数按升序排序.但是,根据上下文,您可能希望按照下载顺序排序,在这种情况下,您会说
return -d["downloads"], d["date"]
Run Code Online (Sandbox Code Playgroud)
在你的keyfunc
.如果您想要按升序排序非零下载数字,然后在此之后拥有所有零下载记录,您可以说类似
return (-d["downloads"] or sys.maxint), d["date"]
Run Code Online (Sandbox Code Playgroud)