【问题标题】:How to sort list of dicts by dict value in pre-defined format?如何按预定义格式的字典值对字典列表进行排序?
【发布时间】:2015-10-08 13:00:21
【问题描述】:

我有一个 dicts 列表,其中描述了学校中的某些课程,其中有些仍在教授,有些不再教授,有些将在未来教授:

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

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

【问题讨论】:

  • 您需要编写自己的 key 函数,该函数接受字典并返回例如状态的序数。另外,请注意,这可能应该是 "INACTIVE"
  • @jonrsharpe - 好的,这是一个返回序数的关键函数。知道我该怎么做吗?我对如何处理这个问题有点不知所措。
  • 你有 2.5k 代表;您现在应该知道这不是代码编写服务。阅读sorted 上的文档,其中解释了函数应该采用什么形式并链接到操作指南,然后尝试自己实现它。如果遇到困难,您可以返回 minimal reproducible example 和具体问题。
  • 似乎你应该有一个列表的字典,其中字典键是活动的、非活动的和即将到来的,每个键的值都是具有该状态的类名列表。 .
  • @jonrsharpe - 你说得对,我知道 SO 不是代码编写服务。我想过循环它们,将它们分隔在单独的列表中,然后再次将这些列表组合在一起,但这似乎不是很 Pythonic。我在 sorted 上查看了文档,但即使在那之后我也不知道该怎么做。如果我的问题是以I'm too lazy to do this myself-question 形式出现的,请见谅。

标签: python list sorting dictionary


【解决方案1】:

您可以使用所有状态权重的字典来做到这一点:

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

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

【讨论】:

    【解决方案2】:

    我刚刚创建了一个方法来处理它,称为 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 ...

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 2010-09-09
      • 2010-11-15
      相关资源
      最近更新 更多