2013-04-01 76 views
0

我知道這聽起來像我只需要從標題中使用json.loads。但我不認爲這是這種情況。或者至少我應該能夠做到這一點沒有任何圖書館(加上我想了解這一點,而不是隻用庫方法解決它)。將Python字典轉換爲類似JSON的對象

什麼我現在是一本字典,其中鍵字和值是這些話總計數:

myDict = { "word1": 12, "word2": 18, "word3": 4, "word4": 45 }

等等...

我想是的它成爲像以下(這樣我就可以將它插入scraperwiki數據存儲):

myNewDict = {"entry": "word1", "count": 12, "entry": "word2", "count": 18, "entry": "word3", "count": 4, "entry": "word4", "count": 45}

我想我可能只是在myDict環,並插入我的新選擇鍵「進入」和「計數」(像這樣)後,每個鍵/值:

for k, v in myDict.iteritems(): 
    myNewDict = { "entry": k, "count": v } 

,但與此,myNewDict僅保存最後結果(所以只給我myNewDict={"entry":"word4", "total":45}

我在這裏錯過了什麼?

+0

請參閱http://stackoverflow.com/questions/3721357/how-to-dump-a-python-dictionary-to-json-when-keys-are-non-trivial-objects和http:// stackoverflow。com/questions/7100125/stored-python-dictionaries – user1929959

+1

字典(或JSON對象)上的鍵必須是唯一的,所以你可以做的最好的是entry-count字典列表。 '[{「entry」:「word1」,「count」:12},{「entry」:「word2」,...},...]' –

回答

2

你需要的是一個list

entries = [] 

for k, v in myDict.iteritems(): 
    entries.append({ "entry": k, "count": v }) 
與列表內涵

甚至更​​好:

entries = [{'entry': k, 'count': v} for k, v in myDict.iteritems()] 

在更多的細節,你在每次循環覆蓋myDict,創建一個新的字典每次。如果你需要它,你就可以鍵/值對的字典這樣的補充:

myDict['key'] = ... 

..但在循環中使用,這將覆蓋到相關的「關鍵」以前的值,因此使用的一個列表。以同樣的方式,如果你輸入:

myNewDict = {"entry": "word1", "count": 12, "entry": "word2", "count": 18, "entry": "word3", "count": 4, "entry": "word4", "count": 45} 

你實際上得到了{'count': 45, 'entry': 'word4'}

注:我不知道什麼是輸出數據,但JSON明智的預期格式,類型的字典列表應該是正確的(以JSON鍵唯一過於相信)。

+1

不要忘記列表理解'[{'entry ':k,'count':v} for k,v in myDict.iteritems()]' – Bryan

+0

@beargle:+1 for list comprehension,將編輯答案。 –

+0

同樣有效的類JSON對象應該是'{'entries':[{k:v} for k,v in myDict.iteritems()]}'。 – martineau

0

雖然目前還不清楚100%清楚你想要什麼輸出,如果你想你上面已經概述只是在格式的字符串,你可以修改你的循環,以這樣的形式:

myCustomFormat = '{' 
for k, v in myDict.iteritems(): 
    myCustomFormat += '"entry": {0}, "count": {1},'.format(k, v) 
# Use slice to trim off trailing comma 
myCustomFormat = myCustomFormat[:-1] + '}' 

那被說,這可能不是你想要的。正如其他人已經指出的那樣,「鑰匙」的重複性會使這一點難以解析。