根据列表中的项目选择列表

时间:2014-07-24 17:34:35

标签: python list

所以,我正在尝试创建一个数独求解器。现在,我想检查一个数字是否在它的行,列和方格中。我可以不将线,列和方形作为函数参数引入吗?有没有办法选择包含项目的列表?这是我的代码:

sudoku = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
line1 = [sudoku[0],sudoku[1],sudoku[2],sudoku[3]]
column1 = [sudoku[0],sudoku[4],sudoku[8],sudoku[12]]
square1 = [sudoku[0],sudoku[1],sudoku[4],sudoku[5]]

def sudoku_cellsolver(x):
    while sudoku[x] == 0:
        number = sudoku[x]+1
        if number not in #"List, column, square":
            sudoku[x] = number
        else:
            number = number + 1
            #Check another time, etc
    while sudoku[x] != 0:
        sudoku_cellsolver(x+1)

欢迎任何帮助。当第二个分支超出范围时我也会出错,但我稍后会处理它。

编辑:

伪代码:

sudoku = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
l1 = {sudoku[0],sudoku[1],sudoku[2],sudoku[3]}   #Converted to set
c1 = {sudoku[0],sudoku[4],sudoku[8],sudoku[12]}   #Converted to set
sq1 = {sudoku[0],sudoku[1],sudoku[4],sudoku[5]}   #Converted to set

group0 = [l1 | c1 | sq1]   #Concatenation of sets

def sudoku_cellsolver(x,group):
if sudoku[x] == 0:
    number = sudoku[x]+1
    if number not in group:
        sudoku[x] = number

主要的问题是我不能使用循环来解决一个接一个的差距,因为我不能修改参数“group0”,以便它在函数内部变为“group1”,我可以用“数独[0]“到”数独[1]“使用”数独[x] =数独[x + 1]“。

如果无法从函数内部从“group0”更改为“group1”,我将必须定义16个几乎相等的函数,其中只有“group”发生更改,并从另一个使用“if”语句决定执行16个函数中的哪一个。

1 个答案:

答案 0 :(得分:1)

您的line1,column1和square1变量看起来像是在全局级别定义的,因此您应该能够像任何其他变量一样访问它们。您已使用if thing not in list构造进入正确的轨道。尝试将列表连接在一起以构建一个可以检查成员资格的列表:

if number not in line1 + column1 + square1:
    sudoku[x] = number

如果你需要能够确定哪些列表number在哪里,那么这对你不起作用,但不管怎样你都不想这样做。

如果要修改函数中的全局变量,则需要使用this SO answer中所述的global关键字。

编辑(根据评论)

现在看来您正在寻找 zip()功能。 Zip()通过索引将多个可迭代的元素组合在一起。例如:

a = [1,2,3]
b = [4,5,6]
c = [7,8,9]

groups = zip(a, b, c)

for i in xrange(3):
    print(groups[i])

输出:

  

(1,4,7)
  (2,5,8)
  (3,6,9)

您可以使用zip()将元素组合在一起吗?