如何将几乎相同的值合并到字典中?

时间:2019-06-27 13:21:40

标签: python

嗨,我有一组几乎相同的字典:

{
    "item": "(L) Shirt",
},
{
    "item": "(M) Shirt",
},
{
    "item": "(S) Shirt",
}
{
    "item": "Shirt",
}

我的预期输出是将它们合并为一个键和另一个键,在字典中将值配对,如下所示:

{
    "item":  "Shirt",
    "sizes": ["L", "M", "S"]
}

我不确定如何进行此操作,因此我寻求帮助。任何帮助是极大的赞赏。谢谢!

3 个答案:

答案 0 :(得分:1)

假设"item"键值中只有一个“尺寸单位” 前缀会有所不同:

d1 = {"item": "(L) Shirt", "brand": "Hanes"}
d2 = {"item": "(M) Shirt", "brand": "Hanes"}
d3 = {"item": "(S) Shirt", "brand": "Hanes"}

clothes_groups = {"sizes": set()}
for d in [d1, d2, d3]:
    clothes_groups["brand"] = d["brand"]
    size, product = d["item"].split() if d["item"].startswith('(') else (None, d["item"])
    clothes_groups["item"] = product
    if size: clothes_groups["sizes"].add(size[1:-1])

print(clothes_groups)

输出:

{'sizes': {'M', 'L', 'S'}, 'brand': 'Hanes', 'item': 'Shirt'}

答案 1 :(得分:0)

这可能会有所帮助。

import re

data = [{'item': '(L) Shirt', 'brand': 'Hanes'}, {'item': '(M) Shirt', 'brand': 'Hanes'}, {'item': '(S) Shirt', 'brand': 'Hanes'}]

result = {}
for i in data:
    if i["brand"] not in result:
        result[i["brand"]] = {}
    size = re.match(r"\((.*?)\)", i["item"]).group(1)     #Get Size
    item = re.sub(r"\(.*?\)", "", i["item"]).strip()      #Get Item
    if item not in result[i["brand"]]:
        result[i["brand"]][item] = {"item": item, "brand": i["brand"], "sizes": []}
    result[i["brand"]][item]["sizes"].append(size)        #Create Required DS

print(result)

输出:

{'Hanes': {'Shirt': {'brand': 'Hanes',
                     'item': 'Shirt',
                     'sizes': ['L', 'M', 'S']}}}

答案 2 :(得分:0)

您可以使用pandas。首先,您要为每个项目提取功能:sizeitem名称。然后,对于每种产品,将size列设置为该特定产品的所有可用尺寸的组合:

import pandas as pd
import re 

list1 = [{"item": "(L) Shirt","brand": "Hanes"},{"item": "(M) Shirt","brand": "Hanes"},{"item": "(S) Shirt","brand": "Hanes"}]

df = pd.DataFrame(list1)
df['size'] = df.item.apply(lambda x : re.findall('\(([^\)]+)\)', x)[0])
df['item'] =  df.item.apply(lambda x : x.split(') ')[1])
df['size'] = df.apply(lambda row : list(df[(df.brand == row['brand']) & (df.item == row['item'])]['size']), axis = 1)

print(df.drop_duplicates(subset=['brand', 'item']).to_dict('r'))

输出

  

[{'brand':'Hanes','item':'Shirt','size':['L','M','S']}]