如何在Python中从for循环重写列表中的值?

如何在Python中从for循环重写列表中的值?,python,list,loops,for-loop,Python,List,Loops,For Loop,我正在做一个数独解算器,我有一块板: board = [ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0,

我正在做一个数独解算器,我有一块板:

board = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
]
假设我现在想把每个数字都改成随机数(1到9之间)。 我试过这个:

for lst in board:
    for num in lst:
        num = random.randint(1, 9)
我想这只是把零变成随机数,但不会把它们写回列表,因为当我打印列表时,它仍然是零。那么我怎样才能把随机数写回到黑板上呢


对不起,我是新来的。我试着查找,但我似乎无法正确理解循环…

您没有在原地更改

适用于范围内的i(透镜(板)):
对于范围内的j(len(板[i]):
board[i][j]=random.randint(1,9)
您还可以创建
,使用该板生成
[低,高)
之间的值,ff高为
(默认值),然后结果来自
[0,低)

将numpy导入为np
打印(np.random.randint(低=1,高=10,大小=(9,9)))
"""
[[4 7 3 4 8 9 8 7 1]
[8 7 1 3 2 8 8 3 2]
[4 8 5 9 8 8 9 1 3]
[5 4 8 5 5 9 3 3 6]
[7 7 4 7 8 7 2 5 1]
[7 9 8 1 2 6 5 7 3]
[9 3 4 1 6 3 2 9 3]
[7 3 5 7 7 1 3 4 3]
[7 4 3 5 3 8 8 8 6]]
"""
试试这个

for i, lst in enumerate(board):
    for j, num in enumerate(lst):
        board[i][j] = random.randint(1, 9)

我将把它作为一个练习来理解为什么这样可以解决将数字分配给列表的问题(虽然不是将每个数字精确分配9次)

您正在分配给一个新变量(命名为num的变量与for变量相同)。 对于您的任务,您需要有索引

使用
范围(len(x))
的最简单解决方案:

可以使用更好的方法。要生成包含随机数的新列表,可以使用列表理解:

# using '_' as variable since it's unused
board = [
    [random.randint(1, 9) for _ in range(9)] # row itself
    for _ in range(9) # iterating over rows
]

较短的方法是:

board = [random.sample(range(1,10), 9) for _ in board]

您正在将
num
更改为随机数,而不是实际列表。为此,您需要执行以下操作:

for i in range(len(board)):
    for j in range(len(board[i])):
        board[i][j] = random.randint(1, 9)
为简单起见,我将使用非嵌套循环。 基本上,您正在迭代board,您正在设置lst=board[current_iteration]。在它的while循环形式中:

#This is just to make my point clear, don't use this, for loops are better most of the times
while i < len(board):
    lst = board[i] #You are setting lst to board[i], then changing lst instead of board[i]
    lst = #Whatever you like
    i += 1

这是否回答了您的问题?在两个嵌套循环中使用下划线
\uuu
可能会有问题。它是一个常见的占位符,但通常在给定语句中仅用于一个目的。否则,答案很好。while循环的有趣解决方案,使用它而不是嵌套for循环有什么好处吗?我的意思是有吗知道这两种方法中哪一种更快/更好的方法?@Vojta我只使用while循环来显示使用for循环时幕后发生的情况。while循环通常更快,但不能将
range()
与while循环和
range()一起使用
是Python中唯一让我震惊的东西,它的速度非常快,所以总体来说,因为你可以使用
range()
使用for循环,速度更快。@Vojta因为你有一个2D数组,你仍然需要一个嵌套的while循环。你最好使用numpy来处理这类东西。我相信numpy会做得更好,但我仍处于学习理解基本Python函数的阶段。你的回答帮助很大,谢谢!@Vojta别担心,numpy不需要掌握任何东西。我建议你偶尔使用一些基本的numpy函数作为快捷方式,但不要使用太多,因为快捷方式会阻止你练习。即使你无意使用numpy,它也必须在你的机器上,这是一个极其重要的库,确切地说是最重要的库。A
high=9
在任何地方都不会给出值9,它必须是
high=10
。请不要仅将代码作为答案发布,还要提供代码的作用以及它如何解决问题的解释。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引选票。
for i in range(len(board)):
    for j in range(len(board[i])):
        board[i][j] = random.randint(1, 9)
#This is just to make my point clear, don't use this, for loops are better most of the times
while i < len(board):
    lst = board[i] #You are setting lst to board[i], then changing lst instead of board[i]
    lst = #Whatever you like
    i += 1
board = np.random.randint(low=1, high=10, size=[10, 10]) #Don't know how big sudoku board is, assume it's 10 * 10.