将现有的 defaultdict 输出为适合耀斑树状图的 JSON 格式?
Posted
技术标签:
【中文标题】将现有的 defaultdict 输出为适合耀斑树状图的 JSON 格式?【英文标题】:Output an existing defaultdict into appropriate JSON format for flare dendogram? 【发布时间】:2015-10-02 04:52:07 【问题描述】:我有一个defaultdict(list)
,我使用simplejson.dumps(my_defaultdict)
将defaultdict
输出为JSON 格式。我正在使用来自http://bl.ocks.org/mbostock/4063570 的树状图的 html 代码,但我正在尝试将我的defaultdict
信息转换为作者正在使用的 JSON 文件的格式。此 JSON 文件名为:/mbostock/raw/4063550/flare.JSON
,可在此链接中找到:http://bl.ocks.org/mbostock/raw/4063550/flare.json。
这是我的默认字典数据:
my_defaultdict = 5: ['child10'], 45: ['child92', 'child45'], 33:['child38']
json_data = simplejson.dumps(my_defaultdict)
所以我当前的 json_data 看起来像这样:
"5": [
"child10"
],
"45": [
"child92",
"child45"
],
"33": [
"child38"
]
所以在我的理解中,数字将是相应的“名称”:“5”,然后我的 JSON 格式文件也将孩子作为“孩子”。就像现在一样,我的 JSON 格式输出不会在树状图的 HTML 代码中运行。
预期的结果是这样的:
"name": "flare",
"children": [
"name": "5",
"children": [
"name": "child10", "size": 5000,
]
"name": "45",
"children": [
"name": "child92", "size": 3501,
"name": "child45", "size": 3567,
]
,
"name": "33",
"children": [
"name": "child38", "size": 8044
]
编辑:
@martineau 的答案有效,但这并不是我想要的。我从defaultdict(list)
和所需的输出开始,如上所述,“孩子”应该是dict
s 的列表,而对于马蒂诺的回答,“孩子”只是一个列表。如果有人可以在其中添加一些东西以使其工作,那就太好了。不用担心“size”变量,暂时可以忽略。
【问题讨论】:
你能发布一个预期输出格式的例子吗? 所以如果你能请到这个链接:bl.ocks.org/mbostock/raw/4063550/flare.json 然后你可以看到。但我会编辑我的问题以包含预期的结果。感谢您指出这一点。 我对“儿童”的回答是一个字符串列表,因为这就是您在问题中my_defaultdict
所拥有的内容。如果您希望它是一个字典列表,那么这就是需要放入 my_defaultdict
的内容 - 这就是为什么我多次要求您显示一些真实数据(或真实数据格式的假数据) ) 在你的问题中。
@martineau:嗨,但真实数据看起来像这样,my_defaultdict。完全一样:列表的默认字典:my_defaultdict = 5: ['child10'], 45: ['child92', 'child45'], 33:['child38']。如果我没有从一开始就说得很清楚,请道歉。这是我的数据。这不是列表的默认字典吗?谢谢。键是数字,例如5, 45, 33。这些值是相应的子级列表。
明白了......那么我的答案的当前版本会尽可能接近您的预期输出(自从您第一次接受它以来它已被修改)。
【参考方案1】:
我用这个解决了:How to convert defaultdict to dict?
供未来可能会搜索它的人使用。我通过将defaultdict
转换为普通字典来实现,只需调用:
b = defaultdict(dict)
a = dict(b)
那么 JSON 就可以识别这个结构了。
【讨论】:
是的,错了!感谢您的建议。我改正了【参考方案2】:你需要从你的默认字典中创建一个新字典。您的示例代码中的孩子只是一个字符串列表,所以我不知道每个字符串的“大小”来自哪里,所以只需将其更改为 dicts
列表(其中没有条目“大小”键)。
from collections import defaultdict
#import simplejson as json
import json # using stdlib module instead
my_defaultdict = defaultdict(list, 5: ['child10'],
45: ['child92', 'child45'],
33: ['child38'])
my_dict = 'name': 'flare',
'children': ['name': k,
'children': ['name': child for child in v]
for k, v in my_defaultdict.items()]
json_data = json.dumps(my_dict, indent=2)
print(json_data)
输出:
"name": "flare",
"children": [
"name": 33,
"children": [
"name": "child38"
]
,
"name": 5,
"children": [
"name": "child10"
]
,
"name": 45,
"children": [
"name": "child92"
,
"name": "child45"
]
]
【讨论】:
我只是将它硬编码为有一些示例输入,即defaultdict
,我基于您在问题中的内容(其中没有针对孩子的“大小”) .您需要向我们提供一个来自您的真实 defaultdict 对象的数据示例。
嘿!有用!谢谢!这很棒。我意识到你的行 my_defaultdict = defaultdict(list, (("5", ["child10"]), ("45", ["child92", "child45"]), ("33", ["child38 "]))) 也是如此。我想问一个简单的问题:json_data = json.dumps(my_dict, indent=2*' ')。我得到一个 TypeError: can't multiply sequence by non-int of type 'str'。请您分析一下您写的内容好吗?在我看来,*(星号)和引号之间有空格。所以为了解决这个问题,我把它保留为 indent = 2。但我很想知道你在那里写了什么。再次感谢!
indent=2*' '
表示 2 个空格字符(它对我来说很好,并且是标准的 Python)。我这样做是因为这就是simplejson
想要的。如果您使用的是内置的 json
模块,它假定为空格字符并且只需要一个整数值。
不,我提到它只是因为您在问题末尾的“预期结果”部分显示了一个。
似乎是一个合理的假设。但坦率地说,我不知道。【参考方案3】:
您需要构建字典以使其包含所需的“子”字段。 json.dumps
不会以任何预定义模式输出数据。相反,传递给json.dumps
的对象必须已经符合任何所需的结构。
试试这样的:
my_defaultdict = "name": "5",
"children":[ "name": "child10", "children":[]]
print json.dumps(my_defaultdict)
【讨论】:
感谢您的回答,但问题是我无法更改 my_defaultdict 的创建方式,因为它是由我的代码中的其他函数创建的,而且我正在处理的数据很大,我不能去手动更改。另外,my_defaultdict 将在每次代码运行时即时构建,因此 my_defaultdict 中的数据不能被硬编码。每次都会不一样。 :( 为什么不能手动更改?这样的逻辑是可以写出来的。 @mattewatabet: my_default 字典由脚本上其他函数的输出填充。它是动态创建的,它非常大,我希望该过程自动化,因为每次脚本运行它都会有所不同。您是否建议我必须找到 my_defaultdict 中的哪些元素是哪个父级的子级并使用您建议的结构构建一个 second_defaultdict ?但那我该怎么做呢?以上是关于将现有的 defaultdict 输出为适合耀斑树状图的 JSON 格式?的主要内容,如果未能解决你的问题,请参考以下文章
如何将现有的 eclipse GWT 项目转换为动态 Web 项目?
有没有办法将现有的 css 解析为 React Native css?