将现有的 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) 和所需的输出开始,如上所述,“孩子”应该是dicts 的列表,而对于马蒂诺的回答,“孩子”只是一个列表。如果有人可以在其中添加一些东西以使其工作,那就太好了。不用担心“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?

将现有的数据库模式转换为星型模式

将现有的objective-c静态库转换为swift

将现有的 QTcpSocket 变形为 QSslSocket

如何将现有的回调 API 转换为 Promise?