2017-04-20 45 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

这将强化字典的密钥,有没有办法避免这种情况?由于键可以改变。 –