[英]Creating a new dictionary from a list of dictionaries
我有一个字典列表,如下所示:
my_dicts =
[{'1A': 1, '3E': 2, 'PRODUCT NAME': 'White Bread loaf large', 'Week': 1},
{'1A': 1, '1B': 1, '1C': 1, '1D': 2, '1E': 2, '2C': 1, '3E': 2, 'PRODUCT NAME': 'Brown Bread loaf
large', 'Week': 1}...]
我想创建一个新字典,如下所示:
new_dict =
[{'HOUSE NAME': '1A', 'White Bread Loaf Large' : 1, 'Brown Bread loaf large' : 1},
{'HOUSE NAME': '1B', 'Brown Bread loaf large' : 1},...
{'HOUSE NAME': '3E', 'White Bread Loaf Large' : 2, 'Brown Bread Loaf Large' : 2}]
每个“房屋名称”都是独一无二的。
我有一个解决方案,可以创建新字典,并使用我提供的示例列表,但它不适用于我的实际列表(包含 27 个字典)
这是解决方案:
houses = set(['1A', '1B', '1C', '1D', '3E'])
output_list = []
for house in houses:
output_entry = {}
output_entry["HOUSE NAME"] = house
for entry in my_dicts:
if entry.get(house) and entry.get("PRODUCT NAME"):
product_name = entry.get("PRODUCT NAME")
if output_entry.get(product_name):
output_entry[product_name] += 1
else:
output_entry[product_name] = 1
output_list.append(output_entry)
解决方案的最后一个 if 语句似乎不起作用,因为无论我将 'else 的条件设置为什么,我的值设置为什么。
你可以这样做:
my_dicts = [{'1A': 1, '3E': 2,
'PRODUCT NAME': 'White Bread loaf large', 'Week': 1},
{'1A': 1, '1B': 1, '1C': 1, '1D': 2, '1E': 2, '2C': 1, '3E': 2,
'PRODUCT NAME': 'Brown Bread loaf large', 'Week': 1}]
merged = dict()
for d in my_dicts:
for k,v in d.items():
if k in ('PRODUCT NAME','Week'): continue # only process house names
merged.setdefault(k,{'HOUSE NAME':k}).update({d['PRODUCT NAME']:v})
result = list(merged.values())
print(result)
[{'HOUSE NAME': '1A', 'White Bread loaf large': 1, 'Brown Bread loaf large': 1},
{'HOUSE NAME': '3E', 'White Bread loaf large': 2, 'Brown Bread loaf large': 2},
{'HOUSE NAME': '1B', 'Brown Bread loaf large': 1},
{'HOUSE NAME': '1C', 'Brown Bread loaf large': 1},
{'HOUSE NAME': '1D', 'Brown Bread loaf large': 2},
{'HOUSE NAME': '1E', 'Brown Bread loaf large': 2},
{'HOUSE NAME': '2C', 'Brown Bread loaf large': 1}]
merged
的字典用作临时索引,通过根据每个房屋名称更新字典来组装新的字典列表。 然后通过忽略merged
的索引par得到最终结果,只取值(即按house合并的字典)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.