【问题标题】:Create a new dictionary from many dictionaries从许多词典创建一个新词典
【发布时间】:2021-02-04 06:06:47
【问题描述】:

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

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

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)

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 小建议,似乎您想将与特定HOUSE_NAME 相关的所有值存储在一起,这意味着它将是一个唯一的条目。为什么不将它用作字典的键?其余字段作为字典中的值?
  • 是的,实际上使用 HOUSE_NAME 作为字典的键是个好主意,我会这样做,谢谢! @匿名
  • @WBM 说实话,除了基本的 for 循环之外,我还没有真正尝试过任何东西,我有点不知所措,所以任何事情都会有很大帮助
  • 这里已经回答了这个问题:stackoverflow.com/a/66055891/5237560(同样的问题,同样的海报)

标签: python list dictionary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我的回答只需要一个先决条件,即您拥有一组/唯一的房子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)
    ...
    

    【讨论】:

    • 非常感谢!你能解释一下地图和过滤器是如何工作的吗?
    • @Luca 添加了一个代码 sn-p。 请不要使用最后一段代码。我这样做是因为 Python 允许这样做,这不是最佳实践。
    • 我对这段代码有一个问题,它只将所有值打印为一个,它似乎没有显示任何高于此的值。似乎 if 语句从未遇到过“if output_entry.get(product_name):”,所以无论我将 else 语句的值设置为什么,所有的值都会变成
    • 也很抱歉 if 语句检查的究竟是什么?我不完全理解。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多