将列表转置为表单对象

时间:2017-07-07 09:04:09

标签: python dictionary

转换此内容的最恐怖的方式是什么:

{'a': ['apple1', 'apple2', 'apple3'], 'b': ['banana1', 'banana2', 'banana3']}

进入这个?

[{'a': 'apple1', 'b': 'banana1'}, {'a': 'apple2', 'b': 'banana2'}, {'a': 'apple3', 'b': 'banana3'}]

我更喜欢不使用数组推导的解决方案。

这是我目前的做法

d = {
    'a': ['apple1', 'apple2', 'apple3'],
    'b': ['banana1', 'banana2', 'banana3']
}

r = []
for k,v in d.items():
    for i in range(len(v)):
        if len(r) <= i:
            r.append({})
        r[i][k] = v[i]

1 个答案:

答案 0 :(得分:3)

您可以使用以下方法:

[dict(zip(d.keys(),vs)) for vs in zip(*d.values())]

使用d原始字典。

这会产生:

>>> [dict(zip(d.keys(),vs)) for vs in zip(*d.values())]
[{'b': 'banana1', 'a': 'apple1'}, {'b': 'banana2', 'a': 'apple2'}, {'b': 'banana3', 'a': 'apple3'}]

代码的工作方式如下,保证 - 如果字典未更改,d.keys()d.values()会生成相同顺序的键/值:所以你可以dict(zip(d.keys(),d.values()))回到原始字典。

现在我们要做的是使用.values()制作字典zip(*d.values())转置。对于每个这样的&#34;列&#34; (转置),我们用d.keys()压缩列并将其转换为字典(带dict(..)),通过使用列表推导,我们最终会迭代所有行。

请注意,迭代从值中的某个列表耗尽时停止。