Есть ли альтернативные подходы к форматированию в списке словарей?

#python #python-3.x #list #dictionary

Вопрос:

У меня есть список словарей:

 data = [  {"id": 55, "name": "Ram", "city": "kathmandu"},  {"id": 66, "name": "Hari", "city": "lalitpur"},  {"id": 77, "name": "Sita", "city": "kathmandu"},  {"id": 88, "name": "Geeta", "city": "pokhara"},  {"id": 99, "name": "Shyam", "city": "pokhara"},  {"id": 95, "name": "Parbati", "city": "bhaktapur"} ]  

Я хочу, чтобы ожидаемый результат был следующим:

 {'kathmandu': ['Ram', 'Sita'], 'lalitpur': ['Hari'], 'pokhara': ['Shyam', 'Geeta'], 'bhaktapur': ['Parbati']}  

Мое решение таково:

 for i in data:  i[i.get('city')] = i['name']  del i['name']  del i['id']  del i['city']   new_data = data[::-1]  first_dict = dict((key, val) for k in data for key, val in k.items()) second_dict = dict((key, val) for k in new_data for key, val in k.items()) for key in first_dict:  if key in second_dict:  new_list = [first_dict[key],second_dict[key]]  new_list2 = list(set(new_list))  second_dict[key] = new_list2   c = {**first_dict, **second_dict}  print(c)  

Это дало желаемые результаты. Но я хочу знать любые альтернативные подходы к этому решению.

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

1. Этот вопрос, вероятно, лучше подходит для сайта обзора кода, поскольку вы заявили, что текущее решение функционально.

Ответ №1:

Вы можете использовать setdefault :

 result={} for di in data:  result.setdefault(di['city'], []).append(di['name'])  gt;gt;gt; result {'kathmandu': ['Ram', 'Sita'], 'lalitpur': ['Hari'], 'pokhara': ['Geeta', 'Shyam'], 'bhaktapur': ['Parbati']}  

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

1. Очень милый. Я не мог ответить на эти три строчки в интервью. Это было очень просто.

Ответ №2:

У вас есть рабочее решение, но вы изменяете диктант на месте и полностью изменяете его. Я бы рекомендовал просто поместить нужные вам данные в new_dict.

Похоже на работу для defaultdict.

 data = [  {"id": 55, "name": "Ram", "city": "kathmandu"},  {"id": 66, "name": "Hari", "city": "lalitpur"},  {"id": 77, "name": "Sita", "city": "kathmandu"},  {"id": 88, "name": "Geeta", "city": "pokhara"},  {"id": 99, "name": "Shyam", "city": "pokhara"},  {"id": 95, "name": "Parbati", "city": "bhaktapur"} ]  from collections import defaultdict  new_data = defaultdict(list) for record in data:  city = record['city']  name = record['name']  new_data[city].append(name)  print(new_data)