Skip to main content
 首页 » 编程设计

python之从带有子列表的列表中创建值字典

2025年05月04日9tuyile006

我想创建一个具有以下输出的 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'}]