【问题标题】:Adding an integer into a dictionary in a dictionary将整数添加到字典中的字典中
【发布时间】:2020-11-29 19:21:45
【问题描述】:

我正在使用 Python。

将整数添加到字典中的字典值会添加到字典中的所有字典。

def addQty(req_data, Cat):
    for item in req_data:
        state = item.get("state")
        sub_cat = item.get("sub_category")
        qty = item.get("quantity")
    
        if state in Cat:
            Cat[state][sub_cat] += int(qty)
    print(Cat)

代码添加到字典中的所有字典。

字典 Cat 是使用以下方法创建的:

def state_and_subcat(State, Subcat):
    Cat = State.copy()
    for state in StateSubCat:
       Cat[state] = Subcat
    return Cat

State 使用 {"state": state, "sub_category": subcat, "quantity": qty} 构建的位置

使用 deepcopy 代替 .copy() 似乎不能解决问题。

Cat 的一个例子是

{ “阿拉巴马州”:{ “配件”:2976, “家电”:1729, “艺术”:3000, “粘合剂”:5974, “书柜”:868, “椅子”:2356, “复印机”:234, “信封”:906, “紧固件”:914, “家具”:3563, “标签”:1400, “机器”:440, “纸”:5178, “电话”:3289, “存储”:3158, “供应”:647, “表”:1241 }, “亚利桑那”:{ “配件”:2976, “家电”:1729, “艺术”:3000, “粘合剂”:5974, “书柜”:868, “椅子”:2356, “复印机”:234, “信封”:906, “紧固件”:914, “家具”:3563, “标签”:1400, “机器”:440, “纸”:5178, “电话”:3289, “存储”:3158, “供应”:647, “表”:1241 }, “阿肯色州”:{ “配件”:2976, “家电”:1729, “艺术”:3000, “粘合剂”:5974, “书柜”:868, “椅子”:2356, “复印机”:234, “信封”:906, “紧固件”:914, “家具”:3563, “标签”:1400, “机器”:440, “纸”:5178, “电话”:3289, “存储”:3158, “供应”:647, “表”:1241 }, “加利福尼亚”:{ “配件”:2976, “家电”:1729, “艺术”:3000, “粘合剂”:5974, “书柜”:868, “椅子”:2356, “复印机”:234, “信封”:906, “紧固件”:914, “家具”:3563, “标签”:1400, “机器”:440, “纸”:5178, “电话”:3289, “存储”:3158, “供应”:647, “表”:1241 }

req_data 的一个例子是:

{ “数量”:“7”, “州”:“亚利桑那州”, “子类别”:“存储” }, { “数量”:“2”, “州”:“加利福尼亚”, "sub_category": "椅子" }, { “数量”:“3”, “州”:“加利福尼亚”, "sub_category": "家具" }, { “数量”:“5”, “州”:“俄亥俄州”, "sub_category": "电话" }, { “数量”:“2”, “州”:“俄亥俄州”, “子类别”:“纸” }, { “数量”:“9”, “州”:“俄亥俄州”, "sub_category": "紧固件" }, { “数量”:“3”, “州”:“加利福尼亚”, “子类别”:“纸” }, { “数量”:“1”, “州”:“加利福尼亚”, “子类别”:“纸” }, { “数量”:“4”, “州”:“加利福尼亚”, “子类别”:“艺术” }, { “数量”:“2”, “州”:“加利福尼亚”, "sub_category": "紧固件" }, { “数量”:“3”, “州”:“加利福尼亚”, "sub_category": "活页夹" }, { “数量”:“6”, “州”:“加利福尼亚”, "sub_category": "供应品" }, { “数量”:“14”, “州”:“加利福尼亚”, "sub_category": "家具" }, { “数量”:“2”, “州”:“宾夕法尼亚州”, "sub_category": "家具" }, { “数量”:“3”, “州”:“加利福尼亚”, “子类别”:“艺术” }

如何将特定的qty 添加到state 中的sub_cat,而不是添加到所有states?

【问题讨论】:

标签: python python-3.x dictionary


【解决方案1】:

因为Cat 中的每个元素都指向同一个对象,所以同一个对象会发生变化。这应该可以解决它:

def state_and_subcat(State, Subcat):
    Cat = State.copy()
    for state in StateSubCat:
       Cat[state] = Subcat.copy()
    return Cat

【讨论】:

    【解决方案2】:

    IIUC,您有一本包含多个状态的字典,每个状态都包含一些物品数量列表(存储、椅子等)。

    从字典列表(每个字典都有状态、项目和数量)中,您想要获取数量并将其添加到该状态和项目的主字典中。

    这是一个函数和列表理解,它们应该一起做你想做的事情。

    1. add_new_quantity():该函数从master获取k=statei=sub_categoryj=quantity,然后通过添加到j返回一个新数量,如果找到的话在req_data。如果没有找到新的数量,它只会返回原来的j

    2. 列表理解:这会迭代主列表,以完全相同的形式返回它。但是,它只是将quantity 替换为上述函数。原始未更改的主迭代器很简单 - {k:{i:j for i,j in v.items()} for k,v in d.items()}。这将简单地返回原始主控,但在遍历其中存在的每个键值之后。我只是简单地将j替换为上面的函数,如果找到相同的状态,则返回一个新数字,req_data中的sub_category,否则返回j的原始值。

    #Assuming this is a list of dictionaries.
    
    req_data = [{'quantity': '7', 'state': 'Arizona', 'sub_category': 'Storage'},
     {'quantity': '2', 'state': 'California', 'sub_category': 'Chairs'},
     {'quantity': '3', 'state': 'California', 'sub_category': 'Furnishings'},
     {'quantity': '5', 'state': 'Ohio', 'sub_category': 'Phones'},
     {'quantity': '2', 'state': 'Ohio', 'sub_category': 'Paper'},
     {'quantity': '9', 'state': 'Ohio', 'sub_category': 'Fasteners'},
     {'quantity': '3', 'state': 'California', 'sub_category': 'Paper'},
     {'quantity': '1', 'state': 'California', 'sub_category': 'Paper'},
     {'quantity': '4', 'state': 'California', 'sub_category': 'Art'},
     {'quantity': '2', 'state': 'California', 'sub_category': 'Fasteners'},
     {'quantity': '3', 'state': 'California', 'sub_category': 'Binders'},
     {'quantity': '6', 'state': 'California', 'sub_category': 'Supplies'},
     {'quantity': '14', 'state': 'California', 'sub_category': 'Furnishings'},
     {'quantity': '2', 'state': 'Pennsylvania', 'sub_category': 'Furnishings'},
     {'quantity': '3', 'state': 'California', 'sub_category': 'Art'}]
    
    #return original+new quantity if found in req_data
    def add_new_quantity(k, i, j, data=req_data):
        new_subs = [r for r in req_data if r['state']==k and r['sub_category']==i]
        try: return j+int(new_subs[0]['quantity'])
        except: return j
    
    #iterate over the master dictionary and update/ignore quantity values
    new_master = {k:{i:add_new_quantity(k,i,j) for i,j in v.items()} for k,v in master.items()}
    print(new_master)
    
    #updated master dictionary
    {'Alabama': {'Accessories': 2976,
      'Appliances': 1729,
      'Art': 3000,
      'Binders': 5974,
      'Bookcases': 868,
      'Chairs': 2356,
      'Copiers': 234,
      'Envelopes': 906,
      'Fasteners': 914,
      'Furnishings': 3563,
      'Labels': 1400,
      'Machines': 440,
      'Paper': 5178,
      'Phones': 3289,
      'Storage': 3158,
      'Supplies': 647,
      'Tables': 1241},
     'Arizona': {'Accessories': 2976,
      'Appliances': 1729,
      'Art': 3000,
      'Binders': 5974,
      'Bookcases': 868,
      'Chairs': 2356,
      'Copiers': 234,
      'Envelopes': 906,
      'Fasteners': 914,
      'Furnishings': 3563,
      'Labels': 1400,
      'Machines': 440,
      'Paper': 5178,
      'Phones': 3289,
      'Storage': 3165,
      'Supplies': 647,
      'Tables': 1241},
     'Arkansas': {'Accessories': 2976,
      'Appliances': 1729,
      'Art': 3000,
      'Binders': 5974,
      'Bookcases': 868,
      'Chairs': 2356,
      'Copiers': 234,
      'Envelopes': 906,
      'Fasteners': 914,
      'Furnishings': 3563,
      'Labels': 1400,
      'Machines': 440,
      'Paper': 5178,
      'Phones': 3289,
      'Storage': 3158,
      'Supplies': 647,
      'Tables': 1241},
     'California': {'Accessories': 2976,
      'Appliances': 1729,
      'Art': 3004,
      'Binders': 5977,
      'Bookcases': 868,
      'Chairs': 2358,
      'Copiers': 234,
      'Envelopes': 906,
      'Fasteners': 916,
      'Furnishings': 3566,
      'Labels': 1400,
      'Machines': 440,
      'Paper': 5181,
      'Phones': 3289,
      'Storage': 3158,
      'Supplies': 653,
      'Tables': 1241}}
    

    PS。我使用变量名master 而不是Cat,您可以随意更改。

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2018-08-27
      • 2018-07-30
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多