How can I sort the list of dictionaries by one dictionary field, for example, by date? For example, I have a list of dictionaries of dictionaries with such keys:

'uid', 'inn', 'soft', 'sender', 'receiver', 'filename', 'package', 'send_date' 

How do I sort it by send_date ?

    2 answers 2

    Pandas module is very convenient for working with such structures (and not only for this) ...

    Suppose you have the following list of dictionaries:

     d = [ {'filename': 'c:\\temp\\file111.txt', 'send_date': datetime.datetime(2016, 11, 25, 12, 12, 12)}, {'filename': 'file001.txt', 'send_date': datetime.datetime(2016,1,1,11,11,11)}, {'filename': 'file003.txt', 'send_date': datetime.datetime(2001,12,31,23,59,59)}, {'filename': 'file099.txt', 'send_date': datetime.datetime(2016,10,10,10,10,10)} ] 

    we create from it DataFrame:

     import datetime import pandas as pd df = pd.DataFrame(d) print(df) 

    Original DF:

     In [25]: print(df) filename send_date 0 c:\temp\file111.txt 2016-11-25 12:12:12 1 file001.txt 2016-01-01 11:11:11 2 file003.txt 2001-12-31 23:59:59 3 file099.txt 2016-10-10 10:10:10 

    Sorted by date DF:

     In [26]: print(df.sort_values('send_date')) filename send_date 2 file003.txt 2001-12-31 23:59:59 1 file001.txt 2016-01-01 11:11:11 3 file099.txt 2016-10-10 10:10:10 0 c:\temp\file111.txt 2016-11-25 12:12:12 

    Sorted by date (in reverse order) DF:

     In [27]: print(df.sort_values('send_date', ascending=False)) filename send_date 0 c:\temp\file111.txt 2016-11-25 12:12:12 3 file099.txt 2016-10-10 10:10:10 1 file001.txt 2016-01-01 11:11:11 2 file003.txt 2001-12-31 23:59:59 

    Sorted by date DF as a list of dictionaries:

     In [28]: df.sort_values('send_date').to_dict('r') Out[28]: [{'filename': 'file003.txt', 'send_date': Timestamp('2001-12-31 23:59:59')}, {'filename': 'file001.txt', 'send_date': Timestamp('2016-01-01 11:11:11')}, {'filename': 'file099.txt', 'send_date': Timestamp('2016-10-10 10:10:10')}, {'filename': 'c:\\temp\\file111.txt', 'send_date': Timestamp('2016-11-25 12:12:12')}] 

      In the sort function, you need to use an expression of the form key=lambda x: x['filename'] .

      An example with all the fields to create laziness, made a shortened version:

       items = [ {'filename': '999.txt', 'package': 1}, {'filename': '123.txt', 'package': 5}, {'filename': '654.txt', 'package': 3}, ] print(sorted(items, key=lambda x: x['package'])) 

      Result:

       [{'package': 1, 'filename': '999.txt'}, {'package': 3, 'filename': '654.txt'}, {'package': 5, 'filename': '123.txt'}] 
      • Will it work for a date? - faoxis
      • @faoxis will be because date objects can be compared. - Jenyay