2017-04-20 2 views
1

ich eine Liste von Wörterbüchern in dieser Form haben:Verwandeln Wörterbuch Python

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

Mein Ziel ist es, in zu verwandeln:

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"}] 

ich dies schrieb, es funktioniert, aber Ich mag wissen, ob Es gibt einen besseren Weg: Die Schlüssel sind immer in einer Liste definiert, und hier werden zur Vereinfachung nur 2 Schlüssel angezeigt, es gibt mehr.

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

Wenn Sie die Schlüssel nicht hart codieren wollen, versuchen Sie meine Lösung. – McGrady

Antwort

1

Wenn Sie nicht möchten, dass die Schlüssel codieren, können Sie Versuchen Sie diese Pythonic Weise

>>> [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) kann das neue Diktat mit dem alten Diktat zusammenführen, nachdem Sie die s_d von dict.pop() Methode entfernt haben.

By the way, wenn Sie halten wollen, dass die d_old:

auf diese Weise versuchen:

>>> [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

Große Lösung! Danke :) –

+0

Würde es Ihnen etwas ausmachen, meine Frage zu einem positiven Kommentar zu geben? –

+0

Diese Lösung ändert das ursprüngliche "Diktat", indem Sie die Taste "s_d" loslassen. nicht sicher, ob diese Nebenwirkung gewollt ist. –

1

Sie könnte verwenden verschachtelte 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()] 

wenn Sie nicht wollen, um die Schlüssel codieren:

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

Dies wird die Schlüssel für das Wörterbuch hardcore, gibt es eine Möglichkeit, das zu vermeiden? Da können sich die Tasten ändern. –