【问题标题】:How to sort a list of dictionaries by 2 keys, one of which is based on an arbitrary list如何按 2 个键对字典列表进行排序,其中一个键基于任意列表
【发布时间】:2011-11-19 02:14:37
【问题描述】:

我正在使用 python。 如何首先按“天”然后按“工作”对下面的字典列表进行排序。
'job' 的排序需要基于 priority_list(不是字母顺序):

priority_list= ['c','a','b']

my_list_of_dicts = [
{'day':5,'job':'c','irrelevant_key':'more stuff'},
{'day':1,'job':'a','irrelevant_key':'stuff'},
{'day':5,'job':'b','irrelevant_key':'more stuff'},
{'day':1,'job':'b','irrelevant_key':'other stuff'}
]

排序结果应该是:

[{'day':1,'job':'a','irrelevant_key':'stuff'},
{'day':1,'job':'b','irrelevant_key':'other stuff'},
{'day':5,'job':'c','irrelevant_key':'more stuff'},
{'day':5,'job':'b','irrelevant_key':'more stuff'}]

非常感谢,

【问题讨论】:

    标签: python list sorting dictionary


    【解决方案1】:
    my_list_of_dicts.sort(key=lambda x: (x['day'], priority_list.index(x['job'])))
    

    【讨论】:

      【解决方案2】:
      def key(d):
          return d['day'], priority_list.index(d['job'])
      
      sorted(my_list_of_dicts, key=key)
      

      【讨论】:

        【解决方案3】:

        对于一个非常小的列表,例如您的示例,使用 list.index() 的答案可以正常工作。

        但是,如果列表很大,那么值得花时间在 priority_list 之外构建一个 dictdict 查找是 O(1),而 list 查找是 O(N)。

        priority_dict = dict((x, i) for i, x in enumerate(priority_list))
        
        def key_day_priority(d):
            return d['day'], priority_dict[d['job']]
        
        my_list_of_dicts.sort(key=key_day_priority)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-11
          • 1970-01-01
          • 2020-11-15
          • 2015-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-04
          相关资源
          最近更新 更多