2013-08-07 2 views
-1

У меня есть список списков в python, которые мне нужно преобразовать в json-словарь. Список выглядит следующим образом:convert python список из списка в словарь

[ 
    ['[{"name":"david","level":"k","xaxis":[[]],"yaxis":[[]],', '"count":[[2011, 6], [2012, 0], [2013, 11]]},'], 

['{"name":"marshall","level":"n","xaxis":[[]],"yaxis":[[]],', 
'"count":[[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]]}]'] 
] 

Что мне нужно, чтобы это было это:

{ 
[ 

    { 
    "name": "david", 
    "level": "k", 
    "xaxis": [[]], 
    "yaxis": [[]], 
    "count":[[2011, 6], [2012, 0], [2013, 11]] 
    }, 

    { 
    "name": "diana", 
    "level": "k", 
    "xaxis": [[]], 
    "yaxis": [[]], 
    "count":[[2011, 6], [2012, 0], [2013, 11]] 
    } 

    ] 
} 

Так в основном, это будет словарь, содержащий вложенные списки, и каждый суб-лист, имеющий один словарь. Как это можно достичь с помощью того, что у меня есть?

ОБНОВЛЕНИЕ:

Итак, позвольте мне разбить его на шаги с целью ясности. Мне нужна структура данных, чтобы быть, как это (что я демпинг в файл .json):

[{ 
"name": "David", 
"level": "s", 
"xaxis": [ 
    [] 
], 
"yaxis": [ 
    [] 
], 
"count": [ 
    [2008, 128], 
    [2009, 51], 
    [2010, 10], 
    [2011, 17], 
    [2012, 0], 
    [2013, 142] 
] 
    }, { 
"name": "Diana", 
"level": "v", 
"xaxis": [ 
    [] 
], 
"yaxis": [ 
    [] 
], 
"count": [ 
    [2008, 11], 
    [2009, 0], 
    [2010, 1], 
    [2011, 2], 
    [2012, 0], 
    [2013, 6] 
] 
}] 

Так как я строить это выглядит следующим образом:

Сначала у меня есть два lists-> имена и расчеты:

names = ['David', 'Diana'] 

calculations = [[[2011, 6], [2012, 0], [2013, 11]], [[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]]] 

Где «расчеты» - список списков списков.

Из этих двух списков, я создаю первоначально упомянутую структуру следующим образом:

import random 
from compiler.ast import flatten 

names_final = [] 
calculations_final = [] 
completed = [] 

for a in names: 
    names_final.append('{"name":"'.encode('utf-8')+a.encode('utf-8')+'","level":"'.encode('utf-8')+random.choice('abcdefghijklmnopqrstuvwxyz').encode('utf-8')+'","xaxis":[[]],"yaxis":[[]],'.encode('utf-8')) 

for b in calculations: 
    calculations_final.append('"count":'.encode('utf-8')+str(b).encode('utf-8')+'},'.encode('utf-8')) 

for i,j in map(None, names_final, calculations_final): 
    completed.append(flatten([i,j])) 

Тогда, наконец, к заполненному списку, я делаю следующие изменения для того, чтобы получить то, что мне нужно:

completed[0][0]='['+completed[0][0] 

completed[-1][-1]= completed[-1][-1][:-1] 
completed[-1][-1]=completed[-1][-1]+']' 

Это приводит к выходу, указанному в верхней части этой части. Мне нужно преобразовать это в объект json, чтобы он просматривался через браузер как объект json на основе запроса, определенного пользователем. Надеюсь, это прояснится. Что вы предлагаете?

+0

Ваш предлагаемый вывод не является допустимым объектом JSON или действительным типом Python.(Это _is_ действительный набор Python, но я не думаю, что это то, что вы хотели.) Словарь не просто содержит значения; он содержит сопоставления от ключей к значениям. – abarnert

+0

Вы правы. Мне нужно преобразовать его в объект json. – user2480542

+0

Ну, это не действительный объект JSON, поэтому покажите нам, какой объект JSON вы _actually_ хотите получить. – abarnert

ответ

2

Если вы просто хотите превратить свой список списков JSON-закодированных вещей в список списков независимо от объектов этих JSON-закодированы вещи декодирования для, это легко:

decoded = [[json.loads(value) for value in inner_list] for inner_list in outer_list] 

И если вы хотите превратить это обратно в один большой JSON-закодирован вещь, это тоже легко:

encoded = json.dumps(decoded) 

Если вы хотите, чтобы превратить этот внешний список в Словаре (который будет кодировать в объект JSON) ... хорошо, что не иметь смысл. Вы не можете просто иметь список (или объект), содержащий список, у вас должен быть ключ для преобразования в эти списки.


Кроме того, ваши входные данные даже не являются списком достоверных JSON-закодированных вещей; это список списков un-decodable фрагментов JSON. Например, этот фрагмент:

"count":[[2011, 6], [2012, 0], [2013, 11]]} 

... не соответствует ни одному.

Может быть, что вы хотите что-то вроде этого:

rejoined = ''.join(''.join(inner_list) for inner_list in outer_list) 
decoded = json.loads(rejoined) 

Это даст вам это:

[{'count': [[2011, 6], [2012, 0], [2013, 11]], 
    'level': 'k', 
    'name': 'david', 
    'xaxis': [[]], 
    'yaxis': [[]]}, 
{'count': [[2008, 130], 
      [2009, 53], 
      [2010, 10], 
      [2011, 17], 
      [2012, 0], 
      [2013, 142]], 
    'level': 'n', 
    'name': 'marshall', 
    'xaxis': [[]], 
    'yaxis': [[]]}] 

Вы можете повторно JSON-кодирование, что, или просто использовать rejoined как есть (потому что это, очевидно, будет эквивалентным).

Теперь, когда вы объяснили немного больше ... вы делаете вещи намного сложнее, чем они должны быть. Существует ряд проблем с кодом:

  • Вы пытаетесь построить строки, закодированные JSON, с помощью строковых манипуляций. Это очень сложно сделать и совершенно ненужно. Просто создайте объект, который вы хотите, и назовите его json.dumps. По возможности, манипулируйте объектами, а не их строковыми представлениями.
  • Вы - encode - десятки строк по пути (и не хватает некоторых из них!) Вместо того, чтобы просто создать большую строку результата и вызвать encode один раз. Кроме того, строки, которые вы вызываете encode, равны str байтовых строках, а не unicode строк, поэтому это даже не имеет смысла. Наконец, json.dumps предпочитает строки unicode (и делает кодировку для вас), поэтому вам не нужно это делать вообще. В общем, сделайте свое кодирование и декодирование как можно ближе к краю, а не всему вашему коду.
  • Вы пытаетесь создать две сложные параллельные структуры данных, а затем закрепить их вместе, когда вы могли бы просто соединить входы вместе. Если вы не можете понять, как скомбинировать вещи в конце, вероятно, вы использовали неправильную структуру данных посередине.
  • Вы используете устаревшие и недокументированные функции, такие как compiler.ast.flatten и map, с функцией None, когда есть отличные способы сделать то же самое, хотя в любом случае они вообще не нужны. Не пишите код Python 1.5, если вам действительно не нужно работать с Python 1.5.

Вот гораздо более простой способ, чтобы написать код:

completed = [] 

for name, calculation in zip(names, calculations): 
    completed.append({'name': name, 
         'level': random.choice('abcdefghijklmnopqrstuvwxyz'), 
         'xaxis': [[]], 
         'yaxis': [[]], 
         'count': calculation}) 

result = json.dumps(completed) 

Теперь completed является ваша структура данных и result является JSON кодирования этой структуры данных. И проблема, которую вы просили о помощи, даже не возникает. (И вам может даже не понадобиться result; многие библиотеки веб-сервисов/RPC/и т. Д. Позволяют вам просто передавать объекты и автоматически JSON-ify их для вас.)

+0

..Пожалуйста, объясните пожалуйста. Он работает отлично. Я ценю вашу доброту и буду следовать советам, которые вы упомянули. Большое спасибо. – user2480542

0

Итак, похоже, что у вас есть фрагменты строки JSON, что при соединении будет действительный JSON, вы просто должны присоединиться все строки вместе, и передать результат json.loads():

data = [['[{"name":"david","level":"k","xaxis":[[]],"yaxis":[[]],', 
     '"count":[[2011, 6], [2012, 0], [2013, 11]]},'], 
     ['{"name":"marshall","level":"n","xaxis":[[]],"yaxis":[[]],', 
     '"count":[[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]]}]'] 
     ] 

>>> decoded = json.loads(''.join(''.join(piece) for piece in data)) 
>>> pprint.pprint(decoded) 
[{'count': [[2011, 6], [2012, 0], [2013, 11]], 
    'level': 'k', 
    'name': 'david', 
    'xaxis': [[]], 
    'yaxis': [[]]}, 
{'count': [[2008, 130], 
      [2009, 53], 
      [2010, 10], 
      [2011, 17], 
      [2012, 0], 
      [2013, 142]], 
    'level': 'n', 
    'name': 'marshall', 
    'xaxis': [[]], 
    'yaxis': [[]]}] 

на данный момент decoded будет словарь Python с вашими данными, если вы хотите преобразовать его в полную строку JSON, вы можете только json.dumps():

>>> json.dumps(decoded) 
'[{"count": [[2011, 6], [2012, 0], [2013, 11]], "yaxis": [[]], "name": "david", "xaxis": [[]], "level": "k"}, {"count": [[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]], "yaxis": [[]], "name": "marshall", "xaxis": [[]], "level": "n"}]' 
+0

спасибо. Не могли бы вы предложить немного больше взглянуть на обновленный вопрос? Благодарю. – user2480542

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