2017-07-07 61 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(..)),通過使用列表理解,我們最終將迭代所有行。

請注意,迭代從數值列表中的某個列表耗盡的那一刻起停止