Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Преобразование списка в словарь

#python #python_3x #словари #dict


Получаю список с данными из БД в таком виде. Kоличество словарей в списке может быть
произвольным: 

 result = [{'name': 'CPG_17_002', 'dnorpattern': '94009'}, 
           {'name': 'CPG_17_002', 'dnorpattern': '94011'}, 
           {'name': 'CPG_17_001', 'dnorpattern': '94004'}, 
           {'name': 'CPG_17_001', 'dnorpattern': '94005'}, 
           {'name': 'CPG_17_000', 'dnorpattern': '94007'}, 
           {'name': 'CPG_17_000', 'dnorpattern': '94010'}, 
           {'name': 'CPG_17_000', 'dnorpattern': '94012'}]


Для дальнейшей обработки и представления данных, данный список необходимо переобразовать
в словарь вида:      

{'CPG_17_002': ['94009', '94011'],
 'CPG_17_001': ['94004', '94005']
 'CPG_17_000': ['94007', '94010', '94012']
}


Ни как не могу сообразить, как написать условие проверки на равенство значений ключей
name в списке для формирования итогового словаря.
    


Ответы

Ответ 1



result = [{'name': 'CPG_17_002', 'dnorpattern': '94009'}, {'name': 'CPG_17_002', 'dnorpattern': '94011'}, {'name': 'CPG_17_001', 'dnorpattern': '94004'}, {'name': 'CPG_17_001', 'dnorpattern': '94005'}, {'name': 'CPG_17_000', 'dnorpattern': '94007'}, {'name': 'CPG_17_000', 'dnorpattern': '94010'}, {'name': 'CPG_17_000', 'dnorpattern': '94012'}] d = {} for i in result: if i['name'] not in d: d[i['name']] = [i['dnorpattern']] else: d[i['name']].append(i['dnorpattern']) print(d) #{ # 'CPG_17_002': ['94009', '94011'], # 'CPG_17_001': ['94004', '94005'], # 'CPG_17_000': ['94007', '94010', '94012'] #}

Ответ 2



Можно использовать метод словаря .get res_dict = {} for item in result: name = item['name'] value = item['dnorpattern'] res_dict[name] = res_dict.get(name, []) + [value] либо вместо словаря взять collections.defaultdict from collections import defaultdict res_dict = defaultdict(list) for item in result: name = item['name'] value = item['dnorpattern'] res_dict[name].append(value)

Ответ 3



Решение с использованием Pandas: import pandas as pd # pip install pandas df = pd.DataFrame(result) res = df.groupby("name")["dnorpattern"].apply(lambda x: x.to_list()).to_dict() Результат: In [15]: res Out[15]: {'CPG_17_000': ['94007', '94010', '94012'], 'CPG_17_001': ['94004', '94005'], 'CPG_17_002': ['94009', '94011']} Пошагово: In [16]: df Out[16]: dnorpattern name 0 94009 CPG_17_002 1 94011 CPG_17_002 2 94004 CPG_17_001 3 94005 CPG_17_001 4 94007 CPG_17_000 5 94010 CPG_17_000 6 94012 CPG_17_000 In [17]: df.groupby("name")["dnorpattern"].apply(lambda x: x.to_list()) Out[17]: name CPG_17_000 [94007, 94010, 94012] CPG_17_001 [94004, 94005] CPG_17_002 [94009, 94011] Name: dnorpattern, dtype: object In [18]: df.groupby("name")["dnorpattern"].apply(lambda x: x.to_list()).to_dict() Out[18]: {'CPG_17_000': ['94007', '94010', '94012'], 'CPG_17_001': ['94004', '94005'], 'CPG_17_002': ['94009', '94011']}

Комментариев нет:

Отправить комментарий