代码之家  ›  专栏  ›  技术社区  ›  user479870

在Python中,按值对嵌套字典排序,按另一个值对余数排序

  •  25
  • user479870  · 技术社区  · 15 年前

    考虑一下这个字典格式。

    {'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

    4 回复  |  直到 15 年前
        1
  •  48
  •   Amber    15 年前

    使用 key 论证 sorted()

    sorted(your_list, key=lambda x: (your_dict[x]['downloads'], your_dict[x]['date']))
    
        2
  •  11
  •   Eli Courtwright    15 年前

    你可以通过 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"]
    
        3
  •  2
  •   Community Mohan Dere    9 年前

    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 是最好的。

        4
  •  0
  •   mouad    15 年前
    a = {'KEY1':{'name':'google','date':20100701,'downloads':0},
     'KEY2':{'name':'chrome','date':20071010,'downloads':0},
     'KEY3':{'name':'python','date':20100710,'downloads':100}}
    
    
    z = a.items()
    
    z.sort(key=lambda x: (x[1]['downloads'], x[1]['date']))