"ValueError: too many values to unpack (expected 2)" should not happen here

"ValueError: too many values to unpack (expected 2)" should not happen here

我目前正在尝试在没有帮助的情况下创建一个数独游戏,但我遇到了一个问题。

def play():
    global myinput
    global column_rdm
    sudoku_col = [[] for _ in range(9)]
    for i in range(9):
        sudoku_col[i].append(0)
    h = 1
    try:
        while h < 10:
            rdm_list = random.sample(range(1, 10), 9)
            test_var = 0
            for j in range(9):
                if rdm_list[j] not in sudoku_col[j]:
                    test_var += 1
            if test_var == 9:
                for rdm_number, g in rdm_list, range(9):
                    sudoku_col[g].append(rdm_number)
                    # Input the values found in the sudoku
                    column_rdm = f"{rdm_number}"
                    myinput = Input(h, g+1)
                    myinput.value_def(column_rdm)  # end
            h += 1
        update()
    # except Exception as e:
    #     print("Erreur dans la création du Sudoku")
    finally:
        print(h)

这里是应该创建我的数独的函数。我创建了 9 个数字的随机列表,这将是我的数独原始数据,我检查这些列表中的每一项是否已经出现在我的“sudoku_col”列中。如果测试正常(即 test_var == 9),那么我将这个原始文件添加到我的模板中。如果没有,我创建一个新的随机列表并让它再次完成测试。我这样做直到我有 9 个原料 (h < 10)。

但是,由于 ValueError,代码在“for rdm_number, g in rdm_list, range(9):”行停止。这不应该发生,因为 rdm_list 和 range(9) 具有相同的长度,并且两个列表中的每个项目都应该正确迭代。我在这里错过了什么?

感谢您的宝贵时间

应该是

for rdm_number, g in zip(rdm_list, range(9)):

你做的和

一样
for rdm_number, g in (rdm_list, range(9)):

它创建了一个包含两个项目的元组,你可以迭代它,你可以看到如果你这样做(它会打印出 rdm_listrange(0, 9) 的任何内容):

for sth in rdm_list, range(9):
    print(sth)

也可以将 while h < 10 替换为 for h in range(9): 并且您不需要增加任何变量并且 for 循环更快。

另一个改进是这样做(而不是使用 range 并按索引访问值):

for rdm, s_col in zip(rdm_list, sudoku_col):
    if rdm not in s_col:
        test_var += 1

还有这个:

sudoku_col = [[] for _ in range(9)]
for i in range(9):
    sudoku_col[i].append(0)

可以很容易地减少到

sudoku_col = [[0] for _ in range(9)]

同样,您不应该使用 range 通过索引访问值,您应该像这样迭代值:for value in iterable:,而不是 for index in range(len(iterable)),如果您还需要索引然后使用这个:for index, value in enumerate(iterable):