Create a new list of dictionaries using values from an old list of dictionaries

Question:

How can I create a new list of dictionaries using only the values from an old list of dictionaries? Essentially I need the new list "new_list_of_dicts" to appear as outlined below.

old_list_of_dicts = [{'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'}, {'vid': 'transpower_162', 'name': '226_FL01_KAL_DCE_FL_050232'}, {'vid': 'transpower_157', 'name': '226_FL02_KAL_DCE_FL_050234'}, {'name': '226_FL03_KAL_DCE_FL_050233', 'vid': 'transpower_163'}, {'vid': 'transpower_159', 'name': '226_XX_INTL_PRSTR_ET_499801'}, {'vid': 'transpower_161', 'name': '226_XX_KAL_T2E_YT_346321'}]

new_list_of_dicts = [{'transpower_036': '221_02_PB_520_REF_174050'}, {'transpower_065': '222_05_KAL_T2E_YT_344991'}, {'transpower_156': '226_02_INTL_PRSTR_ET_499802'}, {'transpower_162': '226_FL01_KAL_DCE_FL_050232'}, {'transpower_157': '226_FL02_KAL_DCE_FL_050234'}, {'226_FL03_KAL_DCE_FL_050233': 'transpower_163'}, {'transpower_159': '226_XX_INTL_PRSTR_ET_499801'}, {'transpower_161': '226_XX_KAL_T2E_YT_346321'}]
Asked By: Rettro

||

Answers:

You can use comprehension to create the new_list_of_dicts:

new_list_of_dicts = [{old['vid']: old['name']} for old in old_list_of_dicts]
Answered By: Allan Elder

If every dictionary in old_list_of_dicts has two values, you can do:

new_list_of_dicts = [dict([d.values()]) for d in old_list_of_dicts]
print(new_list_of_dicts)

Prints:

[
    {"transpower_036": "221_02_PB_520_REF_174050"},
    {"transpower_065": "222_05_KAL_T2E_YT_344991"},
    {"transpower_156": "226_02_INTL_PRSTR_ET_499802"},
    {"transpower_162": "226_FL01_KAL_DCE_FL_050232"},
    {"transpower_157": "226_FL02_KAL_DCE_FL_050234"},
    {"226_FL03_KAL_DCE_FL_050233": "transpower_163"},
    {"transpower_159": "226_XX_INTL_PRSTR_ET_499801"},
    {"transpower_161": "226_XX_KAL_T2E_YT_346321"},
]

EDIT: Previous answer that created a dict instead of a list:

new_list_of_dicts = dict(d.values() for d in old_list_of_dicts)
print(new_list_of_dicts)

Prints:

{
    "transpower_036": "221_02_PB_520_REF_174050",
    "transpower_065": "222_05_KAL_T2E_YT_344991",
    "transpower_156": "226_02_INTL_PRSTR_ET_499802",
    "transpower_162": "226_FL01_KAL_DCE_FL_050232",
    "transpower_157": "226_FL02_KAL_DCE_FL_050234",
    "226_FL03_KAL_DCE_FL_050233": "transpower_163",
    "transpower_159": "226_XX_INTL_PRSTR_ET_499801",
    "transpower_161": "226_XX_KAL_T2E_YT_346321",
}
Answered By: Andrej Kesely

Try this:


old_list_of_dicts = [{'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'}, {'vid': 'transpower_162', 'name': '226_FL01_KAL_DCE_FL_050232'}, {'vid': 'transpower_157', 'name': '226_FL02_KAL_DCE_FL_050234'}, {'name': '226_FL03_KAL_DCE_FL_050233', 'vid': 'transpower_163'}, {'vid': 'transpower_159', 'name': '226_XX_INTL_PRSTR_ET_499801'}, {'vid': 'transpower_161', 'name': '226_XX_KAL_T2E_YT_346321'}]

new_list_of_dicts = [{d["vid"]: d["name"]} for d in old_list_of_dicts]
Answered By: Jordan

Using operator.itemgetter:

from operator import itemgetter

new_list_of_dicts = [dict([itemgetter('vid', 'name')(d)])
                     for d in old_list_of_dicts]

output:

[{'transpower_036': '221_02_PB_520_REF_174050'},
 {'transpower_065': '222_05_KAL_T2E_YT_344991'},
 {'transpower_156': '226_02_INTL_PRSTR_ET_499802'},
 {'transpower_162': '226_FL01_KAL_DCE_FL_050232'},
 {'transpower_157': '226_FL02_KAL_DCE_FL_050234'},
 {'transpower_163': '226_FL03_KAL_DCE_FL_050233'},
 {'transpower_159': '226_XX_INTL_PRSTR_ET_499801'},
 {'transpower_161': '226_XX_KAL_T2E_YT_346321'}]

Alternative if you want a unique dictionary with multiple keys:

from operator import itemgetter
new_list_of_dicts = dict(itemgetter('vid', 'name')(d)
                         for d in old_list_of_dicts)

Output:

{'transpower_036': '221_02_PB_520_REF_174050',
 'transpower_065': '222_05_KAL_T2E_YT_344991',
 'transpower_156': '226_02_INTL_PRSTR_ET_499802',
 'transpower_162': '226_FL01_KAL_DCE_FL_050232',
 'transpower_157': '226_FL02_KAL_DCE_FL_050234',
 'transpower_163': '226_FL03_KAL_DCE_FL_050233',
 'transpower_159': '226_XX_INTL_PRSTR_ET_499801',
 'transpower_161': '226_XX_KAL_T2E_YT_346321'}
Answered By: mozway