2013-04-01 75 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] + '}' 

那被说,这可能不是你想要的。正如其他人已经指出的那样,“钥匙”的重复性会使这一点难以解析。