2017-04-20 71 views
1

我有這種形式的詞典列表:變換辭典蟒蛇

d_old=[{"color":"red","store":"1","s_d":{"M":"1","L":"2"}},  
     {"color":"blue","store":"2","s_d":{"S":"3","XL":"4"}}] 

我的目標是變成這樣:

d_new=[{"color":"red","store":"1","Size":"M", "Stock":"1"}, 
     {"color":"red","store":"1","Size":"L", "Stock":"2"}, 
     {"color":"blue","store":"2","Size":"S", "Stock":"3"}, 
     {"color":"blue","store":"2","Size":"XL", "Stock":"4"}] 

我寫了這一點,它的工作原理,但我想知道,如果有一個更好的方法: 鍵總是定義在一個列表中,這裏爲了簡化,只顯示了兩個鍵,還有更多。

def transform_data(d_old): 
    d_new_list =[] 
    headers=["color","store"] 
    for d in d_old: 
     for key,value in d["s_d"].items(): 
      temp_dict = {header:d[header] for header in headers} 
      temp_dict["Size"] = key 
      temp_dict["Stock"] = value 
      d_new_list.append(temp_dict) 
+0

如果你不想硬編碼的鑰匙,試試我的解決方案。 – McGrady

回答

1

如果你不想硬編碼鍵,可以嘗試這種Pythonic方式

>>> [dict({"Size":k,"Stock":v},**i) for i in d_old for k,v in i.pop("s_d").items()] 

[{'color': 'red', 'Size': 'M', 'store': '1', 'Stock': '1'}, 
{'color': 'red', 'Size': 'L', 'store': '1', 'Stock': '2'}, 
{'color': 'blue', 'Size': 'S', 'store': '2', 'Stock': '3'}, 
{'color': 'blue', 'Size': 'XL', 'store': '2', 'Stock': '4'}] 

dict({"Size":k,"Stock":v},**i)可以通過dict.pop()方法刪除s_d之後,將新的字典與舊的字典合併。

順便說一句,如果你想保持d_old

試試這個方法:

>>> [dict({"Size":k,"Stock":v},**{m:i[m] for m in i if m!='s_d'}) for i in d_old for k,v in i["s_d"].items()] 
[{'color': 'red', 'Size': 'M', 'store': '1', 'Stock': '1'}, {'color': 'red', 'Size': 'L', 'store': '1', 'Stock': '2'}, {'color': 'blue', 'Size': 'S', 'store': '2', 'Stock': '3'}, {'color': 'blue', 'Size': 'XL', 'store': '2', 'Stock': '4'}] 
+0

偉大的解決方案!謝謝:) –

+0

你介意給我的問題upvote? –

+0

該解決方案通過彈出s_d''鍵來更改原始的'dict'。不知道是否需要這種副作用。 –

1

,你可以使用嵌套list comprehension

d_old = [{'color': 'red', 'store': '1', 's_d': {'M': '1', 'L': '2'}}, 
     {'color': 'blue', 'store': '2', 's_d': {'S': '3', 'XL': '4'}}] 

d_new = [{'color': item['color'], 'store': item['store'], 
      'size': size, 'stock': stock} 
     for item in d_old for size, stock in item['s_d'].items()] 

,如果你不想硬編碼的鑰匙:

d_new = [dict({key: values for key, values in item.items() if key != 's_d'}, 
       size=size, stock=stock) 
     for item in d_old for size, stock in item['s_d'].items()] 
+0

這將強化字典的密鑰,有沒有辦法避免這種情況?由於鍵可以改變。 –