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

Alg*_*g_D 1 python dictionary list

我想创建一个具有以下输出的json输出:

[ {'data': [<val1>,<valn>], 'name': '<nameA>'}, 
  {'data': [<val1>,<valn>], 'name': '<nameB>'} ]
Run Code Online (Sandbox Code Playgroud)

基本上,它采用由子列表形成的列表,并且对于每个子列表的第一个元素,值将附加到"名称",并且保留将在属性"数据"中形成单个列表.

下面的代码创建了所需的输出,但只有在项目列表中的每个子列表包含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
Run Code Online (Sandbox Code Playgroud)

正确的ouptut: [{'data':[30.0],'name':'A'},{'data':[10.0],'name':'B'},{'data':[9.28],'名称':'C'}]

问题是当子列表有超过2个元素时,例如:

items= [['A', 1 ,30.0], ['B', 2, 10.0], ['C', 3, 9.28]]
Run Code Online (Sandbox Code Playgroud)

应该产生:

[{'data': [1,30.0], 'name': 'A'}, {'data': [2,10.0], 'name': 'B'}, {'data': [3,9.28], 'name': 'C'}]
Run Code Online (Sandbox Code Playgroud)

我尝试过类似的东西:

items = [{"name":k, "data":[ x[1:] for x in g] } for k,g in items]
Run Code Online (Sandbox Code Playgroud)

但它会产生错误:ValueError:要解压缩的值太多

我怎样才能获得所需的输出?

Two*_*ist 6

试试这个:

[{'name': x[0], 'data': x[1:]} for x in my_list]
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 2.7或3.x,则可以使用理解来创建字典和列表.该[1:]切片为您提供了开始的第一个元素的列表.

您的问题是,您通过在不需要一个([x[1:] for x in g])的地方写一个理解来复制您创建列表的工作.切片已经返回一个列表,如果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'}]
Run Code Online (Sandbox Code Playgroud)

  • 只需对切片进行列表理解即可.`[{'name':x [0],'data':[float(y)for y in x [1:]]} for my in my_list]` (2认同)

Tay*_*ser 5

如果您知道第一项始终是关键,那么此列表理解将完成工作: new_dict = [{"name":k[0], "data":k[1:]} for k in items]

你得到"解压太多值"的原因是因为你有比你有变量更多的值.Python不知道将剩余的变量分配给g.如果items数组总是有每个子阵列三个要素,你可以创建一个非常具体的理解,像这样:new_dict = [{"name":k, "data":[g,d]} for k,g,d in items].但到目前为止,第一次理解是多才多艺的.