2015-01-13 2 views
0

Это простейший пример словаря, созданного json.load, что я т иметь дело с:Multiple ДЛЯ петель в Перебор словаря в Python

{ 
    "name": "USGS REST Services Query", 
    "queryInfo": { 
     "timePeriod": "PT4H", 
     "format": "json", 
     "data": { 
      "sites": [{ 
       "id": "03198000", 
       "params": "[00060, 00065]" 
      }, 
      { 
       "id": "03195000", 
       "params": "[00060, 00065]" 
      }] 
     } 
    } 
} 

Иногда может быть 15-100 сайтов с неизвестным наборов параметров на каждом сайте. Моя цель состоит в том, чтобы либо создать два списка (один из которых хранит идентификаторы «сайта» и другие хранимые «параметры») или значительно упрощенный словарь из этого оригинального словаря. Есть ли способ сделать это, используя вложенные для циклов с байтами, парами значений, используя метод iteritem()?

То, что я пытался далеко это:

queryDict = {} 

for key,value in WS_Req_dict.iteritems(): 
    if key == "queryInfo": 
     if value == "data": 
      for key, value in WS_Req_dict[key][value].iteritems(): 
       if key == "sites": 
        siteVal = key 
        if value == "params": 
         paramList = [value] 
         queryDict["sites"] = siteVal 
         queryDict["sites"]["params"] = paramList 

Я бегу в проблемы с получением второй цикл работы. Я еще не просмотрел списки.

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

ответ

1

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

for site in WS_Req_dict['queryInfo']['data']['sites']: 
    queryDict[site['id']] = site['params'] 

Если некоторые из ключей может быть пропущена, dict «s get метод является вашим другом:

for site in WS_Req_dict.get('queryInfo',{}).get('data',{}).get('sites',[]): 

позволит вам спокойно игнорировать недостающие ключи. Но это намного менее читаемо, поэтому, если бы это было необходимо, я бы инкапсулировал его в функцию - и часто вам может не понадобиться этот уровень предосторожности! (Еще одна хорошая альтернатива - это инкапсуляция try/except KeyError, чтобы игнорировать отсутствующие ключи, если они действительно возможны в вашем конкретном случае использования).

+0

Две вещи - вам где-то не хватает скобки? и что делает queryID? Является ли queryID новым словарем, который вы предлагаете использовать там? – traggatmot

+0

Я думаю, что скобки в порядке, но 'queryId' - это то, как я записал результирующее' dict' - редактирование, чтобы использовать 'queryDict', как вы изначально, и не повод для изменения его имени. –

+0

Можете ли вы мне помочь прояснить эту ошибку: «TypeError: строковые индексы должны быть целыми» – traggatmot

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