【问题标题】:Python KeyError: 0 troubleshootingPython KeyError: 0 故障排除
【发布时间】:2020-03-30 13:19:20
【问题描述】:

我一般是 Gurobi 和 Python 的新手,每当我运行我的代码(这显然不完整,但我的教授鼓励我们在编写代码时运行我们的代码,因为这样更容易排除故障。

我在多个论坛上读过这意味着什么(它试图从字典中访问键 '0' 值,其中键不存在于该字典中(或未初始化),但仍然不真的不明白吗?

from gurobipy import *

# Sets
SetA = ["a", "b", "c", "d", "e"]
SetB = ["f", "g", "h", "i", "j",
   "k", "l", "m", "n", "o"]

A = range(len(SetA))
B = range(len(SetB))

# Data
PC = 100
X = [1, 2, 3, 4, 5]
D = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Y = [
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
[31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
[41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
]

m = Model("Problem 2")

# Variables
Z = {(a,b): m.addVar() for a in A for b in B}

# Objective
m.setObjective(quicksum((PC+X[a]+Y[a][b])*Z[a][b] for a in A for b in B), GRB.MINIMIZE)

【问题讨论】:

  • 对它的基本了解,请看这个:KeyError
  • 这能回答你的问题吗? I'm getting Key error in python
  • @MayankPorwal 不,因为我认为我的代码中确实存在第 0 个键?
  • 您对Z 的索引与其创建方式不一致。它是使用 2 元素元组作为键创建的平面字典,例如Z[(1, 2)]。但它作为嵌套列表(或字典)被访问,例如Z[1][2]。选择两者之一,并始终如一地使用它。
  • {(a,b): f"{a} {b}" for a in range(2) for b in range(4)} --> {(0, 0): '0 0', (0, 1): '0 1', (0, 2): '0 2', (0, 3): '0 3', (1, 0): '1 0', (1, 1): '1 1', (1, 2): '1 2', (1, 3): '1 3'} 这行得通。错误在m.addVar(),但你没有提供它的来源。

标签: python python-3.x dictionary gurobi keyerror


【解决方案1】:

解决方案:

将最后一行更改为:

 m.setObjective(quicksum((PC+X[a]+Y[a][b])*Z[a,b] for a in A for b in B), GRB.MINIMIZE)

【讨论】:

    【解决方案2】:

    你得到keyerror 0,因为在你的列表理解的开头,在哪里

    for a in A
    

    a 等于 0,所以在这一行

    m.setObjective(quicksum((PC+X[a]+Y[a][b])*Z[a][b] for a in A for b in B), GRB.MINIMIZE)
    

    在您输入Z[a][b] 的位置,您正尝试访问字典Z 的键0 的值(然后再次访问字典Z[a] 的键0,它甚至不存在),但是在字典 Z 没有键 0,因为你所有的键都是元组。

    因此,当您正确导出自己时,您不想访问存储在字典 Z[a] 的键 b 中的值,而是要访问存储在字典 Z 的键 (a, b) 中的值,所以

    m.setObjective(quicksum((PC+X[a]+Y[a][b])*Z[a,b] for a in A for b in B), GRB.MINIMIZE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-15
      • 2020-07-16
      • 2021-05-07
      • 1970-01-01
      • 2013-07-15
      • 2010-11-30
      • 2021-09-11
      • 2012-02-18
      相关资源
      最近更新 更多