从 for 循环和 if 条件更改为列表理解和使用 ortools 的问题

Problem changing from for loop and if condition to list comprehension and using ortools

我正在编写一个 python 程序,利用 ortools 来解决问题。我正在尝试使用列表推导式尽可能多地更改 for 循环。几乎一切顺利,但有一个我无法更改

原版效果不错:

L_Filas = [i for i in range(9)]  
C_Columnas = [i for i in range(9)] 
# tablaOrigD is a nested dictionary, imported from an Excel sheet

modname = 'Sudoku'

solver = pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING
#solver = pywraplp.Solver.GUROBI_MIXED_INTEGER_PROGRAMMING

s: Solver = pywraplp.Solver(modname, solver)

    #############
    # Variables #
    #############


x = [[[s.IntVar(0, 1, 'X_%s_%s_%s' % (i, j, k)) for k in nValores] for j in nColumnas] for i in nFilas]

nula = s.NumVar(0, 10, 'Nula')

    #################
    # RESTRICCIONES #
    #################

for f in L_Filas:
     for c in L_Columnas:
          if tablaOrigD[f + 1][c + 1] :
                s.Add(x[f][c][tablaOrigD[f + 1][c + 1] - 1] == 1)
      #[s.Add((x[f][c][tablaOrigD[f + 1][c + 1] - 1] for c in L_Columnas if tablaOrigD[f+1][c+1])==1)]

一步一步,首先我尝试更改最内部的循环 (c var):

for f in L_filas:
        [s.Add((x[f][c][tablaOrigD[f + 1][c + 1] - 1] for c in L_Columnas if tablaOrigD[f+1][c+1])==1)]

这行不通。没有语法或其他错误。程序结束时给出了错误的结果。

我的错误在哪里?

正如克雷格所说,目前没有机会重现您的程序,因此我必须做出一些假设。我假设您的第一个代码示例中的 s.Add() 实际上使用的 \t 比您的代码段中显示的多。我认为至少列表理解中的括号设置不正确。 所以我的综合列表指的是原始代码,如下所示:

for f in L_Filas:
    for c in L_Columnas:
        if tablaOrigD[f+1][c+1]:
            s.Add(x[f][c][tablaOrigD[f+1][c+1] - 1] == 1)

可以简化为:

[s.Add(x[f][c][tablaOrigD[f+1][c+1] - 1] == 1) for f in L_Filas for c in L_Columnas if tablaOrigD[f+1][c+1]]

如果这没有帮助,请提供有关您的问题和 s.Add() 的更多信息,以及您是否知道您正在将表达式 boolean 传递给 s.Add().