2015-01-13 51 views
0

在字典中的迭代循環這是由json.load創建的字典,我個人有T處理的簡單的例子:倍數在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網站未知每個站點的參數集。我的目標是要麼創建兩個列表(一個存儲「站點」ID和另一個存儲「參數」)或從這個原始字典中簡化了很多字典。有沒有辦法做到這一點使用iteritem()方法嵌套for循環與凱,價值對?

我試圖到目前爲止是這樣的:

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 

我遇到麻煩第二FOR循環工作。我還沒有考慮過拔出列表。

我認爲這可能是一種總體上愚蠢的做法,但我目前還看不到它。

回答

1

我認爲只要可行,您可以通過索引來簡化代碼,而不是循環使用iteritems

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

如果一些鍵可能會丟失,dictget方法是你的朋友:

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