【问题标题】:KeyError: 0 Python关键错误:0 Python
【发布时间】:2017-10-27 16:11:31
【问题描述】:

您好,我还是 python 的新手,想知道为什么会有这行:

    RP[p][t] = demand[p][t] / fillingrate[p]

导致错误:KeyError: 0

它遵循代码的相关部分。这只是符号错误还是解决它的最佳方法是什么?

productname = ('milk', 'yoghurt', 'buttermilk')
fillingrate = (1.5, 1.0, 2.0)

day = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)

demand = [
(5, 4, 3, 3, 4, 9, 13, 5, 4, 4, 3, 5, 10, 12),
(3, 5, 3, 5, 5, 4,  3, 4, 3, 4, 3, 4,  5,  5),
(3, 3, 5, 4, 4, 5,  4, 3, 4, 3, 4, 5,  4,  5)
]

T = range (len(day))
P = range (len(productname))


for p in P:
   for t in T:
        RP[P,T] = model.addVar (lb = 0, vtype = GRB.CONTINUOUS,
        name = 'Regular Production[' + str(p) + ',' + str(t) + ']')
        print(demand[p][t])
        print(fillingrate[p])
        RP[p][t] = demand[p][t] / fillingrate[p]
        print(RP[p][t])

【问题讨论】:

  • 您正在使用[P,T] 索引RP,这是一个范围元组。 RP 在哪里声明? RP 在哪里得到[0] 元素?

标签: python keyerror


【解决方案1】:

[x, y] 的索引与[x][y] 的索引完全不同。前者产生一个使用元组索引的单一维度,而后者产生一个参差不齐的二维数组。

您需要在索引[x] 处创建一个包含所需值的新对象。

【讨论】:

    【解决方案2】:

    表达式Pp 不同。在您的代码中,第一个是范围,第二个是该范围内的整数。

    因此,RP[P,T] 表达式在两个方面是错误的:它使用了错误的下标,并以错误的方式组合它们(正如另一个答案所指出的那样)。

    我想你想要RP[p][t]

    【讨论】:

      【解决方案3】:

      keyerror: 0 通常意味着您正在尝试访问存储在字典中不存在的键 0 中的值。

      在您的代码中发生这种情况是因为,存在

      day = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
      T = range (len(day))
      

      你得到

      print(T)
      
      range(0, 14)
      

      所以它的第一个元素是0,
      当你运行这个

      for p in P:
         for t in T:
              RP[P,T] = model.addVar (lb = 0, vtype = GRB.CONTINUOUS,
              name = 'Regular Production[' + str(p) + ',' + str(t) + ']')
              print(demand[p][t])
              print(fillingrate[p]) 
              RP[p][t] = demand[p][t] / fillingrate[p] 
              print(RP[p][t])
      

      你知道t得到的第一个值是0,然后在行

      RP[p][t] = demand[p][t] / fillingrate[p] 
      

      当您将 t 传递给字典 RP(我猜它没有键 0)时,会引发 keyerror: 0

      另外,正如其他问题所指出的,您应该注意到

      [x, y] 索引与 [x][y] 索引绝对不一样。 前者导致使用元组索引的单个维度, 而后者会产生参差不齐的二维数组。

      为了帮助您修复代码,了解RP 的定义方式可能会很有用。

      【讨论】:

      • demand 是一个list,它肯定有一个index 0;它不会在查找0 时失败,也永远不会引发KeyError。问题是关于两行后的错误。
      • 谢谢,实际上我在写答案时选择了错误的变量。我更新了答案。
      猜你喜欢
      • 2017-09-10
      • 2021-11-06
      • 2018-09-20
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多