2016-06-14 3 views
-5

Я хотел бы получить некоторую помощь преобразовывая кортеж в формате [(X, Y, Z),(..) типа (string, string, int)] в файл JSON в формате:преобразования кортежи в 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 значения должны быть вложены в детях, а значение Х будет использоваться один раз в уникальную строке.

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

Ваш ожидаемый выход недействителен JSON. –

+0

Почему вы хотите дублировать объект '{" name ":" Y "," value ": Z}'? –

+2

Пожалуйста, объясните, как получить от ваших входных данных ваш ожидаемый результат! –

ответ

0

Предполагая, что вы хотите получить список 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 так что вы Арен» t сохраняя их все в баране.

+0

Это работало абсолютно идеально. Спасибо – SerialDev

+0

Если он отвечает на ваш вопрос, подумайте о принятии ответа. – nephlm

0
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) 

Обновлено.

+0

'NameError: name 'v' не определен' –

+0

' AttributeError: объект 'list' не имеет атрибута 'update'' –

0

Попробуйте это:

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"} 
+0

Это дает мне желаемый результат, однако у меня есть один вопрос о последующем вопросе. Если бы я хотел, чтобы выход JSON имел («яйцо», «колбаса», 2), («спам», «испеченные бобы», 3) в виде кортежей внутри детского дерева. с одним именем и детьми, перечисленными один раз. Как вы предлагаете мне продолжить? – SerialDev

+0

Пожалуйста, отредактируйте ваш вопрос или создайте новый. –

+0

отредактировал вопрос по вашему запросу – SerialDev

Смежные вопросы