如何按预定义的格式按字典值排序dicts列表?

时间:2015-10-08 13:00:21

标签: python list sorting dictionary

我已经列出了某些学校的某些课程,其中一些课程仍在教授,有些课程已不再教授,有些课程将在未来教授:

[
    {'status': 'DEACTIVE', 'name': 'Music'},
    {'status': 'DEACTIVE', 'name': 'Juggling'},
    {'status': 'ACTIVE', 'name': 'Chess'},
    {'status': 'ACTIVE', 'name': 'Dutch Language'},
    {'status': 'COMING', 'name': 'Python'},
    {'status': 'COMING', 'name': 'Drinking coffee like a pro'},
]

我现在想要订购此列表,以便ACTIVE是第一个,然后是DEACTIVE,最后是COMING。我找到了这样的解决方案:

sorted(a, key=dict.values, reverse=True)

但是只能按字母顺序排序,我想以自定义方式对其进行排序。有人知道我怎么做吗?

2 个答案:

答案 0 :(得分:4)

您可以使用具有所有状态权重的字典来执行此操作:

STATUS_RANK = {"ACTIVE": 1, "DEACTIVE": 2, "COMING": 3}

courses.sort(key=lambda x: STATUS_RANK[x['status']])

答案 1 :(得分:0)

我刚刚创建了一个方法来处理它,如下所示调用order_my_list(): 您只需将列表作为参数传递即可!

 def order_my_list(lst):
     ordered = []
     loop = 0
     finished_flag = 0
     while finished_flag == 0:
         for x in range(0,len(lst)):
             if loop == 0:
                 if lst[x]['status'] == 'ACTIVE':
                     ordered.append(lst[x])
             if loop == 1:
                 if lst[x]['status'] == 'DEACTIVE':
                     ordered.append(lst[x])
             if loop == 2:
                 if lst[x]['status'] == 'COMING':
                     ordered.append(lst[x])
             if loop == 3:
                 finished_flag = 1

         loop += 1
     return ordered

我确定有更好/更快的方法来做到这一点,但这就是我如何解决它,因为我的python知识不是很好:p ...