【问题标题】:Converting a python dictionary to a JSON - like object将 python 字典转换为 JSON 类对象
【发布时间】:2013-04-01 20:15:18
【问题描述】:

我知道这听起来像是我只需要使用标题中的 json.loads。但我认为情况并非如此。或者至少我应该能够在没有任何库的情况下做到这一点(而且我想理解这一点,而不仅仅是用库方法解决它)。

我目前拥有的是一个字典,其中键是单词,值是这些单词的总数:

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 并在我新选择的键“entry”和“count”之后插入每个键/值(像这样):

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

但是有了这个,myNewDict 只保存最后一个结果(所以只给我myNewDict={"entry":"word4", "total":45}

我在这里错过了什么?

【问题讨论】:

标签: python json dictionary


【解决方案1】:

你需要的是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 方面,dicts 列表应该是正确的(在 JSON 中键是唯一的我也相信)。

【讨论】:

  • 不要忘记列表理解[{'entry': k, 'count': v} for k, v in myDict.iteritems()]
  • 同样有效的类似 JSON 的对象是 {'entries': [{k:v} for k, v in myDict.iteritems()]}
【解决方案2】:

虽然不清楚 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] + '}'

话虽如此,这可能不是您想要的。正如其他人指出的那样,“键”的重复性会使解析变得有些困难。

【讨论】:

    猜你喜欢
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2011-11-26
    相关资源
    最近更新 更多