2015-07-05 4 views
0

У меня есть базовые данные, подобные этому, уникальный идентификатор в базе данных в d_id. (данные с именем, как «вход»)Преобразование Список dicts вложенный список dicts

[ 
    { 
     "d_id": "a1", 
     "d_name": "Fishing", 
     "location": "ABC", 
     "location_id": 1, 
     "rest_id": 2, 
     "rest_name": "Grilling" 
    }, 
    { 
     "d_id": "a2", 
     "d_name": "catching", 
     "location": "ABC", 
     "location_id": 1, 
     "rest_id": 3, 
     "rest_name": "Kayaking" 
    }, 
    { 
     "d_id": "a3", 
     "d_name": "Fishing2", 
     "location": "ABC", 
     "location_id": 1, 
     "rest_id": 2, 
     "rest_name": "Grilling" 
    }, 
    { 
     "d_id": "a4", 
     "d_name": "Watering", 
     "location": "DEF", 
     "location_id": 2, 
     "rest_id": 4, 
     "rest_name": "Careoff" 
    } 
] 

Я хочу сделать словарь следующим образом, который является вложенной JSON классифицированы по LOCATION_ID, rest_id и d_id:

населенные пункты будут иметь несколько мест, каждое место будет иметь множественный rest_id, и каждое остальное будет иметь несколько d_id-х

{ 
    "localities" : [ 
     { 
      "location": "ABC", 
      "location_id": 1, 
      "rest_details": [ 
       { 
        "rest_id": 2, 
        "rest_name": "Grilling", 
        "d_details" : [ 
         { 
          "d_id" : "a1", 
          "d_name" : "Fishing" 
         }, 
         { 
          "d_id" : "a3", 
          "d_name" : "Fishing2" 
         } 
        ] 
       }, 
       { 
        "rest_id": 3, 
        "rest_name": "Kayaking", 
        "d_details" : [ 
         { 
          "d_id" : "a2", 
          "d_name" : "catching" 
         } 
        ] 
       } 
      ] 
     }, 
     { 
      "location" : "DEF", 
      "location_id": 2, 
      "rest_details": [ 
       { 
        "rest_id" : 4, 
        "rest_name" : "Careoff", 
        "d_details" : [ 
         { 
          "d_id" : "a4", 
          "d_name": "Watering" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

Я попытался следующим за последние несколько дней, в котором я попытался отделить данные в location_info, rest_info, d_info:

для размещения информации

location_info = [] 
location_fields = {'location', 'location_id', 'd_id', 'rest_id' } 
for item in input: 
    loc = {key:value for key,value in item.items() if key in location_fields} 
location_info.append(loc) 

для уникальных записей location_info

k=1 
while k<len(location_info): 
    if location_info[k] == location_info[k-1]: 
     location_info.pop(k-1) 
    else: 
     k = k+1 

для rest_info

rest_info = [] 
rest_fields = {'rest_name','rest_id', 'd_id', 'loc_id'} 
for item in input: 
    res = {key:value for key,value in item.items() if key in restaurant_fields} 
    restaurant_info.append(res) 

для d_info

d_info = [] 
d_fields = {'d_id', 'd_name', 'location_id'} 
for item in input: 
    dis = {key:value for key,value in item.items() if key in d_fields} 
d_info.append(dis) 

для merging rest_info с location_info

for ta in location_info: 
    for tb in rest_info: 
     if ta['loc_id'] == tb['loc_id']: 
      ta['localities'] = tb 

tb не производит первый этап ожидаемого результата.

+4

Вы должны сначала попробовать, что хотите, а затем искать или помогать. И если вы попытались это сделать, пожалуйста, позаботьтесь об этом. –

+1

Вы в основном просите людей сделать это за вас. Этот сайт посвящен помощи людям с конкретными проблемами, а не бесплатной услугой кодирования. –

+0

@TanveerAlam намерение было обратиться за помощью по этому вопросу, и я стою исправлен как новый пользователь. Извинения. Я добавил информацию, которую я попытался. в случае, если вы могли бы посоветоваться, было бы очень полезно. –

ответ

0

Ваш код посыпается ошибками. Вы должны хотя бы запустить каждый из фрагментов самостоятельно и посмотреть, дают ли они желаемый результат шага (потому что они этого не делают).

Кроме того, ваш подход кажется излишне сложным. Я хотел бы попробовать это так:

locations = {} 
for elem in input: 
    rest_details = [] 
    curr_rest_detail = {"rest_id": elem["rest_id"], "rest_name":elem["rest_name"], "d_details":[{"d_id":elem["d_id"], "d_name":elem["d_name"]}]} 
    try: 
     rest_details = locations[elem["location_id"]]["rest_details"] 
     rest_detail_exists = False 
     for detail in rest_details: 
      if detail["rest_id"] == curr_rest_detail["rest_id"]: 
       rest_detail_exists = True 
       detail["d_details"].append({"d_id":elem["d_id"], "d_name":elem["d_name"]}) 
       break 
     if not rest_detail_exists: 
      rest_details.append(curr_rest_detail) 
    except KeyError: 
     locations[elem["location_id"]] = {"location": elem["location"], "location_id":elem["location_id"], "rest_details":[curr_rest_detail]} 

result = {"localities": [value for value in locations.values()]} 

Этот код в основном перебирает элементы ввода и добавляет запись всякий раз, когда запись еще не существует. Если он уже существует, он добавляет дополнительную информацию.

+0

@x squared - спасибо. он работает намного лучше, чем я пытался сделать. Узнайте больше о попытке и исключении. –

Смежные вопросы