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

dict中包含特定数据的词典排序列表

  •  0
  • bxdoan  · 技术社区  · 6 年前

    我有下列词典:

    data = [
    {'name' : 'doan',
     'policies': [{'policy_start': '2019-05-01'},
              {'policy_start': '2019-05-02'}]},
    {'name' : 'bui',
     'policies': [{'policy_start': '2019-05-03'},
                  {'policy_start': '2019-05-04'}]},
    {'name' : 'xuan',
     'policies': []}
    ]
    

    怎么能 sorted 他们先用 policy_start 结果如下:

    [{'name': 'bui', 'policies': [{'policy_start': '2019-05-03'}, {'policy_start': '2019-05-04'}]}, 
    {'name': 'doan', 'policies': [{'policy_start': '2019-05-01'}, {'policy_start': '2019-05-02'}]},
    {'name' : 'xuan','policies': []}]
    

    我试过函数:

    sorted(data, key=lambda item: item['policies'][0]['policy_start'], reverse=True)
    

    但这只适用于数据:

    data = [
    {'name' : 'doan',
     'policies': [{'policy_start': '2019-05-01'},
                  {'policy_start': '2019-05-02'}]},
    {'name' : 'bui',
     'policies': [{'policy_start': '2019-05-03'},
                  {'policy_start': '2019-05-04'}]}]
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Shibiraj    6 年前

    试试这个,

    sorted(data, key=lambda item: item['policies'][0]['policy_start'] if item['policies'] else '', reverse=True)

        2
  •  1
  •   adnanmuttaleb    6 年前

    试试这个:

    from datetime import datetime
    from datetime import  timedelta
    
    some_old_date = (datetime.now() - timedelta(days=1000)).date()
    key = lambda item: datetime.strptime(item['policies'][0]['policy_start'], '%Y-%m-%d').date()\
     if item['policies'] else some_old_date
    sorted(data, key=key, reverse=True)
    

    输出:

    [{'name': 'bui',
      'policies': [{'policy_start': '2019-05-03'},
       {'policy_start': '2019-05-04'}]},
     {'name': 'doan',
      'policies': [{'policy_start': '2019-05-01'},
       {'policy_start': '2019-05-02'}]},
     {'name': 'xuan', 'policies': []}]