我想创建一个具有以下输出的 json 输出:
[ {'data': [<val1>,<valn>], 'name': '<nameA>'},
{'data': [<val1>,<valn>], 'name': '<nameB>'} ]
基本上,它采用由子列表组成的列表,对于每个子列表的第一个元素,值转到属性“名称”,其余部分将在属性“数据”中形成一个列表。
下面的代码创建了所需的输出,但仅当项目列表中的每个子列表都有 2 个元素时才有效。
items= [['A', 30.0], ['B', 10.0], ['C', 9.28]]
print "ITEMS before==",items
items = [{"name":k, "data":[g]} for k,g in items]
print "ITEMS after==",items
正确的输出: [{'data': [30.0], 'name': 'A'}, {'data': [10.0], 'name': 'B'}, {'data': [9.28], 'name': 'C'}]
问题是当子列表有超过 2 个元素时,例如:
items= [['A', 1 ,30.0], ['B', 2, 10.0], ['C', 3, 9.28]]
应该产生:
[{'data': [1,30.0], 'name': 'A'}, {'data': [2,10.0], 'name': 'B'}, {'data': [3,9.28], 'name': 'C'}]
我试过类似的方法:
items = [{"name":k, "data":[ x[1:] for x in g] } for k,g in items]
但它会产生错误:ValueError: too many values to unpack
我怎样才能实现所需的输出?
请您参考如下方法:
试试这个:
[{'name': x[0], 'data': x[1:]} for x in my_list]
如果您使用的是 Python 2.7 或 3.x,则可以使用推导来创建字典和列表。 [1:] 切片为您提供了一个从第一个元素开始的列表。
你的问题是你在重复你的工作来创建一个列表,在你不需要的地方写一个理解([x[1:] for x in g])。 slice 已经返回一个列表,如果 g 不是列表,这(如您所见)将失败。
因为如果在双元素列表上调用 x[1:] 将返回一个单元素列表,只要您的列表至少有两个长度并且第一个值是始终是“名称”键。观察:
>>> my_list = [['A', 1 ,30.0], ['B', 2, 10.0], ['C', 3, 9.28]]
>>> [{'name': x[0], 'data': x[1:]} for x in my_list]
[{'data': [1, 30.0], 'name': 'A'}, {'data': [2, 10.0], 'name': 'B'}, {'data': [3, 9.28], 'name': 'C'}]
>>> my_list = [['A', 1 ,30.0], ['B', 2, 10.0], ['C', 3]]
>>> [{'name': x[0], 'data': x[1:]} for x in my_list]
[{'data': [1, 30.0], 'name': 'A'}, {'data': [2, 10.0], 'name': 'B'}, {'data': [3], 'name': 'C'}]
