#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']}
Комментариев нет:
Отправить комментарий