转换此内容的最恐怖的方式是什么:
{'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]
答案 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(..)
),通过使用列表推导,我们最终会迭代所有行。
请注意,迭代从值中的某个列表耗尽时停止。