Sort list of dictionaries by key

Question:

I have a list of dictionaries where the order of the keys is not consistent. Ideally I would like ‘vid’ to always come first with ‘name’ being second. As you can see below, sometimes ‘name’ comes first. How can I sort this list of dictionaries to always have ‘vid’ first?

viri_assets = [
    {'vid': 'transpower_036', 'name': '221_02_PB_520_REF_174050'},
    {'name': '242_07_DINA_HSTLR_YT_210238', 'vid': 'transpower_168'},
    {'vid': 'transpower_170', 'name': '242_08_DINA_HSTLR_YT_210220'},
    {'name': '251_PS04_PB_520_REF_109968', 'vid': 'transpower_166'},
    {'vid': 'transpower_165', 'name': '251_PS05_PB_520_REF_109967'},
    {'name': '31089', 'vid': 'transpower_064'}]

I have tried using sorted(viri_assets, key=lambda d: list(d.keys())) but it does not work.

Asked By: Rettro

||

Answers:

You don’t want to call sorted on your list, but on each dict of the list

Use .items() to get key-value pairs for each dict, and it’ll sort them by the first element of the pair: the key. Set reverse to True to get "vid" before "name".

viri_assets = [{'vid': 'transpower_036', 'name': '221_02_PB_520_REF_174050'},
               {'vid': 'transpower_065', 'name': '222_05_KAL_T2E_YT_344991'},
               {'name': '226_02_INTL_PRSTR_ET_499802', 'vid': 'transpower_156'}]

viri_assets = [dict(sorted(d.items(), reverse=True)) for d in viri_assets]

print(viri_assets)

Output:

[{'vid': 'transpower_036', 'name': '221_02_PB_520_REF_174050'}, 
 {'vid': 'transpower_065', 'name': '222_05_KAL_T2E_YT_344991'}, 
 {'vid': 'transpower_156', 'name': '226_02_INTL_PRSTR_ET_499802'}]
Answered By: azro