在Python中按值对嵌套字典进行排序,将余数除以另一个值

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)

  • 嗨,我在调用时遇到错误:TypeError:unhashable type:'dict'`:sorted(d.items(),key = lambda x:(d [x] ['downloads'],d [x] ['date']))`,其中d等于OP中的字典。如果有人知道问题,请告诉我。谢谢 (3认同)
  • 这只是返回键,有没有办法获取键和您要排序的项目?例如,有没有办法执行 `sorted((d.keys(), lambda y: d[y]['downloads']), key=lambda x: (d[x]['downloads'])`这实际上是正确的?该代码原样向我抛出了 @ChickenFeet 得到的相同 TypeError (3认同)
  • 非常好的线路!以下是反转排序顺序的方法:只需在末尾添加 `reverse=True` 作为参数到 `sorted` 函数即可。谢谢 (2认同)
  • 改成上面的那个。your_list = sorted(your_dict, key=lambda x: (your_dict[x]['downloads'], your_dict[x]['date'])) (2认同)
  • @ChickenFeet 使用 `d.keys()` 而不是 `d.items()` (2认同)

Eli*_*ght 9

您可以传递一个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)