从许多词典创建一个新词典

时间:2021-02-03 20:40:41

标签: python list dictionary

是否可以从其他词典创建词典?

我有一个字典列表,看起来像这样:

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

基本上我想要键 'HOUSE NAME' ,具有每个家喻户晓的值,以 'my_dicts' 'PRODUCT NAME' 作为键,值是房子名称的值(IE 1)

2 个答案:

答案 0 :(得分:0)

不确定您的意思,但我建议您使用 House_Name 值中的列表以字符串格式保存 PRODUCT NAME 值

答案 1 :(得分:0)

我的回答只需要一个先决条件,那就是你有一套/唯一的房子列表IDs

my_dicts = [{
    '1A': 1,
    '3E': 2,
    'PRODUCT NAME': 'White Bread loaf large',
    'Week': 1
}, {
    '1A': 1,
    '1C': 2,
    'PRODUCT NAME': 'White Bread loaf large',
    'Week': 1
}, {
    '1A': 1,
    '1B': 1,
    '1C': 1,
    '1D': 2,
    'PRODUCT NAME': 'Brown Bread loaf large',
    'Week': 1
}]

# !:Prerequisite you have the IDs as a unique set
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)

print(output_list)

您可以使用 mapfilter

使其更加简洁

输出:

[
    {'HOUSE NAME': '1A', 'White Bread loaf large': 2, 'Brown Bread loaf large': 1}, 
    {'HOUSE NAME': '1C', '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': 1}, 
    {'HOUSE NAME': '1D', 'Brown Bread loaf large': 1}
]
<块引用>

这只是为了展示 mapfilter 如何根据 OP 的要求工作,请不要这样做,因为它会生成代码可读性较差且不是pythonic

from functools import reduce
...
output_entry["HOUSE NAME"] = house
    output_entry = {
        **output_entry,
        **dict(
            reduce(
                lambda x, y: {
                    k: x.get(k, 0) + y.get(k, 0)
                    for k in set(x) | set(y)
                }, (map(
                    lambda x: {x["PRODUCT NAME"]: 1},
                    filter(lambda x: x.get(house) and x.get("PRODUCT NAME"), my_dicts)))))
    }

    output_list.append(output_entry)

print(output_list)
...