2017-07-07 62 views
0

什么是转换这个最Python的方式:移调列出来形成对象

{'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] 
+2

但最Python的方式将是使用列表理解。你为什么不想用一个? –

回答

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()))回到原来的字典。

现在我们做的是我们通过使用zip(*d.values())来制作转置字典的.values()。对于转换的每一个这样的“列”,我们使用d.keys()对该列进行压缩并将其转换为字典(使用dict(..)),通过使用列表理解,我们最终将迭代所有行。

请注意,迭代从数值列表中的某个列表耗尽的那一刻起停止