嗨,我有一组几乎相同的字典:
{
"item": "(L) Shirt",
},
{
"item": "(M) Shirt",
},
{
"item": "(S) Shirt",
}
{
"item": "Shirt",
}
我的预期输出是将它们合并为一个键和另一个键,在字典中将值配对,如下所示:
{
"item": "Shirt",
"sizes": ["L", "M", "S"]
}
我不确定如何进行此操作,因此我寻求帮助。任何帮助是极大的赞赏。谢谢!
答案 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
。首先,您要为每个项目提取功能:size
和item
名称。然后,对于每种产品,将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']}]