合并字典列表中的字典对

时间:2016-04-15 17:25:00

标签: python list python-2.7 dictionary structure

输入:

[{'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

4 个答案:

答案 0 :(得分:1)

Python 3.5 +

使用PEP 448的语法:

>>> [{**x, **y} for x, y in zip(l[::2], l[1::2])]
[{'data': [[20, 400], [30, 450]], 'name': 'pc1'}, ...]

旧版Python:

>>> [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]]}]