转换字典python

转换字典python,python,dictionary,key,Python,Dictionary,Key,我在此表格中有一份词典列表: 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"

我在此表格中有一份词典列表:

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"}]
我写了这篇文章,但我想知道是否有更好的方法: 键总是在列表中定义的,为了简化,这里只显示了2个键,还有更多

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)
您可以使用嵌套的:

如果不想对钥匙进行硬编码:

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()]

如果你不想硬编码的关键,你可以尝试这种蟒蛇的方式

>>> [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},**在您通过dict.pop方法删除s_d之后,我可以将新dict与旧dict合并

顺便说一句,如果你想让d_保持旧:

试着这样做:

>>> [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'}]

这会使字典的键变硬,有办法避免吗?因为密钥可以更改。如果您不想硬编码密钥,请尝试我的解决方案。很棒的解决方案!谢谢:此解决方案通过弹出“s_d”键来更改原始dict。不确定是否需要这种副作用。
>>> [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'}]