【问题标题】:Tuples conversion into JSON with python [closed]使用 python 将元组转换为 JSON [关闭]
【发布时间】:2016-10-14 19:37:25
【问题描述】:

我需要一些帮助,将 [(X, Y, Z),(..) 类型的 (string, string, int)] 类型的元组转换为以下格式的 JSON 文件:

{
    "name": "X",
    "children": [{
        "name": "Y",
        "value": Z
    }]
}

我至少有 1M 值要转换,目前我尝试使用字典的键:

b = (dict(zip(keys,row)) for row in tuples)  

使用 JSON 库

print (json.dumps(list(b)))  

但是这会产生格式为

的 JSON
[{"type": "y", "name": "z", "count": z},...  

我希望 Y 和 Z 值嵌套在子项下,并且 X 值在每个唯一字符串中使用一次。

   {
    "name": "X",
    "children": [{
        "name": "Y",
        "value": Z
    },
                {
        "name": "Y2",
        "value": Z2
    }]
   }

【问题讨论】:

  • 您的预期输出不是有效的 JSON。
  • 为什么要复制对象{"name": "Y", "value": Z}
  • 请解释如何从您的输入数据中获取您的预期输出!
  • 我已经修复了你的 JSON。

标签: python json pandas d3.js data-science


【解决方案1】:
import json 
list_of_tuples = [('jack', 'jill', 5), ('baba','black', 6)]
result = list()
for each_tuple in list_of_tuples:
    temp = dict()
    temp['name'] = each_tuple[0]
    temp['children'] = [{'name': each_tuple[1],'value':each_tuple[2]}]
    result.append(temp)

json.dumps(result)

已更新。

【讨论】:

  • NameError: name 'v' is not defined
  • AttributeError: 'list' object has no attribute 'update'
【解决方案2】:

假设您想要一个 dicts 列表作为 json 的输出,每个 dict 都是您问题中的形式:

以下一行将把它放入您寻找的数据结构中,每个元组生成它自己的完整结构:

[{'name':i[0], 'children': [{'name': i[1], 'value': i[2]}]}  for i in tuples]

但我怀疑您希望外部名称是唯一的,内部子代是由多个元组构建的,这样只有一个使用 'name' == X 生成的此类结构。

要以内存高效的方式执行此操作,请先按 X 对元组进行排序:

# should work as long as you aren't doing any fancy sorting
stuples = sorted(tuples) 

name = None
dat = None
for t in stuples:
    if name != t[0]:
        if dat is not None:
            writeDat(json.dumps(dat))
        name = t[0]
        dat = {'name': t[0], 'children': [{'name': t[1], 'value': t[2]}]}
    else:
        dat['children'].append({'name': t1, 'value': t[2]})

我假设你有一个函数可以写出其中一个函数,例如 writeDat(),它接受 json,所以你不会将它们全部存储在 ram 中。

【讨论】:

  • 这绝对完美。谢谢
  • 如果它回答了您的问题,请考虑接受答案。
【解决方案3】:

试试这个:

import json

ts = [("egg", "bacon", 1), ("egg", "sausage", 2), ("spam", "baked beans", 3)]
for t in ts:
    o = {"name": t[0], "children": [{"name": t[1], "value": t[2]}]}
    j = json.dumps(o)
    print(j)

输出:

{"children": [{"name": "bacon", "value": 1}], "name": "egg"}
{"children": [{"name": "sausage", "value": 2}], "name": "egg"}
{"children": [{"name": "baked beans", "value": 3}], "name": "spam"}

【讨论】:

  • 这个给了我想要的输出,但是我有一个后续问题。如果我希望 JSON 输出具有 ("egg", "sausage", 2), ("spam", "baked beans", 3) 作为子树内的元组。只列出了一次姓名和孩子。你建议我如何继续
  • 请编辑您的问题或创建一个新问题。
  • 按要求编辑了问题
  • 有了已经给出的答案,您应该能够自己解决剩下的问题。
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多