输入:
[{'name': 'pc1'},
{'data': [[20, 400], [30, 450]]},
{'name': 'pc2'},
{'data': [[40, 525], [50, 600], [70, 680]]},
{'name': 'pc3'},
{'data': [[80, 700], [90, 980]]}]
我想要实现的目标:
[{'name': 'pc1', "data": [[20,400]. [30,450]]},
{'name': 'pc2', "data": [[40, 525], [50, 600], [70, 680]]},
etc.
我似乎无法想出一个优雅的方法来做到这一点,同时保留我正在寻找的确切结构。 “数据”值是列表列表至关重要。
我正在使用Python 2.7
答案 0 :(得分:1)
使用PEP 448的语法:
>>> [{**x, **y} for x, y in zip(l[::2], l[1::2])]
[{'data': [[20, 400], [30, 450]], 'name': 'pc1'}, ...]
>>> [dict(x, **y) for x, y in zip(l[::2], l[1::2])]
[{'data': [[20, 400], [30, 450]], 'name': 'pc1'}, ...]
答案 1 :(得分:1)
我会这样做。应该工作在2.6+,也许更旧
original = [{'name': 'pc1'},
{'data': [[20, 400],
[30, 450]]},
{'name': 'pc2'},
{'data': [[40, 525],
[50, 600],
[70, 680]]},
{'name': 'pc3'},
{'data': [[80, 700],
[90, 980]]}]
new = []
for d1,d2 in zip(original[::2], original[1::2]):
d1.update(d2)
new.append(d1)
vaultah编辑了他的答案,包括python2,我不知道你可以做dict(dict1,** dict2),我更喜欢他的答案,但我会把它留作另类。
另外,MikeMüller使用副本的回答(和评论)提醒我你可以就此做到,并且我的代码正在修改原始变量。所以你可以这样做:
original = [{'name': 'pc1'},
{'data': [[20, 400],
[30, 450]]},
{'name': 'pc2'},
{'data': [[40, 525],
[50, 600],
[70, 680]]},
{'name': 'pc3'},
{'data': [[80, 700],
[90, 980]]}]
for d1,d2 in zip(original[::2], original[1::2]):
d1.update(d2)
original.remove(d2)
然后原始列表将等于您想要的而不创建新变量。但我仍然喜欢vaultah的一个班轮更好
答案 2 :(得分:0)
这是我可以接近清洁解决方案
values = [{'name': 'pc1'},
{'data': [[20, 400], [30, 450]]},
{'name': 'pc2'},
{'data': [[40, 525], [50, 600], [70, 680]]},
{'name': 'pc3'},
{'data': [[80, 700], [90, 980]]}]
groupings = [{'name' : values[g]['name'], 'data' : values[g + 1]['data']} for g in xrange(0, len(data) - 1, 2)]
答案 3 :(得分:0)
>>> [dict(*zip(d1.items(), d2.items())) for d1, d2 in zip(orig[::2], orig[1::2])]
[{'data': [[20, 400], [30, 450]], 'name': 'pc1'},
{'data': [[40, 525], [50, 600], [70, 680]], 'name': 'pc2'},
{'data': [[80, 700], [90, 980]], 'name': 'pc3'}]
其中:
>>> orig = [{'name': 'pc1'},
{'data': [[20, 400], [30, 450]]},
{'name': 'pc2'},
{'data': [[40, 525], [50, 600], [70, 680]]},
{'name': 'pc3'},
{'data': [[80, 700], [90, 980]]}]