遍历多个嵌套字典

时间:2020-06-09 10:46:56

标签: python pandas dictionary

我需要通过遍历以下两个字典并从“ current_inventory”中减去sales_demand来计算变量“剩余库存”。

但是,词典没有共享相同的键。即某些天没有销售,因此需求为0(例如“ 2020-02-29”)

我如何遍历字典以产生此输出而又不会由于缺少键而引起KeyError的问题?

以下数据:

# Current inventory 
inventory = {'2020-02-28':{'ASF': 220102,
                           'MFA': 100109,
                           'PRE': 218256},
             '2020-03-29':{'ASF': 321200,
                           'MFA': 151505,
                           'PRE': 175000},
             '2020-03-01':{'ASF': 312765,
                           'MFA': 300021,
                           'PRE': 118561},
             '2020-03-02':{'ASF': 121203,
                           'MFA': 209909,
                           'PRE': 210000}}
# Sales Demand
sales = {
  '2020-02-28':{
    'CEYLON':{
      'ASF': 55000,
      'MFA': 0,
      'PRE': 0
     },
    'PACIFIC MAJOR':{
      'ASF': 100000,
      'MFA': 0,
      'PRE': 0
     },
    'CCSC YASA JING':{
      'ASF': 10000,
      'MFA': 6000,
      'PRE': 18000
     }},
  '2020-03-01':{
    'ABC':{
      'ASF': 0,
      'MFA': 0,
      'PRE': 65000},
    'DEF etc':{
      'ASF': 0,
      'MFA': 19191,
      'PRE': 0}},
  '2020-03-02':{
    'ABC':{
      'ASF': 75000,
      'MFA': 10000,
      'PRE': 0},
    'DEF etc':{
      'ASF': 55000,
      'MFA': 55000,
      'PRE': 0}}}

预期结果:

remaining_inventory = {}

for date in dates:
  for vessel in vessels:
    for grade in grades:
      remaining_inventory[date][grade] = current_inventory[date][grade] - sales[date][vessel][grade]

注意-我需要跟踪每笔交易,即产品离开库存去往每艘船,因此不能简单地汇总每天,等级的总销售需求。

1 个答案:

答案 0 :(得分:0)

我认为我不完全理解您想要的输出,因此您还必须澄清一下缩写的含义,以便更好地了解循环中要执行的操作。

为避免KeyError,我看到了两个选项

  • 如果您知道某个词典中总是存在键,有时又会在另一个词典中存在键,请循环遍历可能包含该键的词典。因此,如果它在此较小的词典中,则它始终在另一个词典中,并且不会出现KeyError。

  • 如果某个字典中有时存在键,而另一本字典中有时存在键,则最好遍历一个字典的键并执行以下操作:

for key in first_dict:
     if key in second_dict.keys():
         do_something()

编辑:我认为这是您想要做的,但我不确定100%:

for date in sales:
    remaining_inventory[date] = {}
    for vessel in sales[date]:
        for grade in sales[date][vessel]:
             remaining_inventory[date][grade] = inventory[date][grade] - sales[date][vessel][grade]thing()

输出:

 {'2020-02-28': {'ASF': 210102, 'MFA': 94109,  'PRE': 200256}, 
  '2020-03-01': {'ASF': 312765, 'MFA': 280830, 'PRE': 118561}, 
  '2020-03-02': {'ASF': 66203,  'MFA': 154909, 'PRE': 210000}}

我添加了remaining_inventroy[date] = {},因为您将一个值添加到了尚不存在的字典中。