转换字典python

时间:2017-04-20 12:57:34

标签: 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","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)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果您不想对键进行硬编码,可以试试这种Pythonic方式

Assembly_2.D
在您通过>>> [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)后,

s_d可以将新字典与旧字典合并。

顺便说一句,如果你想保留dict.pop()

尝试这种方式:

d_old