将列表的python列表转换为字典

时间:2013-08-07 21:00:21

标签: python list dictionary

我有一个python列表,我需要转换为json字典。清单如下:

[
  ['[{"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]]
   }

  ]
}

基本上,它将是一个包含子列表的字典,每个子列表都有一个字典。如何用我拥有的东西来实现它?

UPDATING:

所以,为了清楚起见,我将其分解为几个步骤。我需要数据结构是这样的(我将转储到.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]
]
}]

所以我构建它的方式如下:

首先我有两个清单 - >名称和计算:

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对象查看,基于用户定义的查询。我希望这会澄清。你们有什么建议?

2 个答案:

答案 0 :(得分:2)

如果您只想将JSON编码事物列表的列表转换为JSON编码事物解码的任何对象列表的列表,那很容易:

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

如果你想把它变成一个大的JSON编码的东西,那也很容易:

encoded = json.dumps(decoded)

如果您还想将该外部列表转换为dict(将编码为JSON对象)......嗯,这没有意义。你不能只有一个包含列表的字典(或对象),你必须有一个字典映射键到那些列表


最重要的是,您的输入数据甚至不是有效JSON编码事物列表的列表;它是不可解码的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.flattenmap等已弃用和未记录的功能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;许多web服务/ RPC /等库让你只需传递对象并自动为它们提供JSON-ify。)

答案 1 :(得分: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"}]'