Python ';ValueError:值太多,无法解压缩';

Python ';ValueError:值太多,无法解压缩';,python,nested-lists,minesweeper,Python,Nested Lists,Minesweeper,我正在写一个扫雷舰的基本版本。你可以从用户那里得到行、列、炸弹的数量和它们的位置。你应该计算每个元素周围的炸弹数量。考虑下面的例子: 输入 输出为: * 2 * 2 3 2 2 * 3 2 * * 这是我的密码: n, m = [int(x) for x in input().split()] k = int(input()) #number of bombs #location of bombs bomb = [] for i in range(k): r,c = [int(r

我正在写一个扫雷舰的基本版本。你可以从用户那里得到行、列、炸弹的数量和它们的位置。你应该计算每个元素周围的炸弹数量。考虑下面的例子: 输入

输出为:

* 2 *
2 3 2
2 * 3
2 * *
这是我的密码:

n, m = [int(x) for x in input().split()]


k = int(input()) #number of bombs

#location of bombs
bomb = []
for i in range(k):
    r,c = [int(r) - 1 for r in input().split()]
    bomb.append([r,c])

#making the grid
map = []
for x in range(n):
    map.append([])
    for y in range(m):
        map[x].append(0)

#locate bombs       
for i, j in bomb:
    map[i][j] = '*'

#count the bombs
Ns = 0
for i, j in map:
    for x in range(-1, 2):
        for y in range(-1, 2):
            if map[i + x][j + y] == '*':
                Ns += 1

    map[i][j] = Ns

print(map)
我的问题是在投降时找到炸弹。我得到
值错误:第25行的值太多,无法解压缩。你知道我该怎么修吗

for i, j in map:
这是无效的
map
是一个列表列表,类似于4x3数组

您似乎试图遍历
map
的索引,并将这些索引与列表内容混淆。试一试

for i in range(len(map)):
    for j in range(len(map[i])):
        ...

代码中有两个潜在的问题

首先,你的地图实际上有3个值要为每个值解包(因为你的m是3),而不是两个。这是您需要修复的行:

用于地图中的i,j:

相反,您需要的可能是解压缩map的每个值,如下所示:

for x in range(len(map)):
    for y in range(len(map[i])):
        square = map[x][y]
其次,检查周围环境的代码可能会遇到问题,因为您只需将矿井的x和y减少/增加1,这将使您的代码尝试在地图中查找不存在的索引!如果x是2,加1会得到3,打破你的列表

您可能想要的是:

for i in range(max(0,x-1),min(x+1,n-1)+1):
    for j in range(max(0,y-1),min(y+1,m-1)+1):
这只接受周围环境中的值,并且不违反数组边界。Max(0,x-1)阻止我们给出负数组边界,min(x+1,n-1)阻止我们超过Max数组边界。y也是如此

结合起来,代码可能如下所示:

#count the bombs
for x in range(len(map)):
    for y in range(len(map[i])):
        # if x,y is not a mine
        if map[x][y] != '*':
            # check the surroundings of x,y for mines
            Ns = 0
            for i in range(max(0,x-1),min(x+1,n-1)+1):
                for j in range(max(0,y-1),min(y+1,m-1)+1):
                    # if this surrounding block is a mine, add to Ns
                    if (map[i][j]) == '*':
                        Ns += 1
                        print("Not safe: " + str(Ns))
            # append the Ns number to the x,y block
            map[x][y] = Ns

for layer in map:
    print(layer)
产出:

['*', 2, '*']
[2, 3, 2]
[2, '*', 3]
[2, '*', '*']
请注意,这绝对不是问题的最佳解决方案;最好的方法是在进行过程中保存值,这样我们就不必检查所有3到8个周围的瓷砖是否有每个瓷砖,但希望这能帮助您了解处理扫雷舰的基本情况


希望有帮助

正确格式化代码。。顺便说一句,这里
n,m=[int(x)for x in input().split()]
您在rhs上有一个列表comps,它将为您提供一个类型为list的单一值。。您试图将其解包为2个变量,这是不可能的。欢迎使用SO<代码>输入()
接受参数提示。使用它很重要,否则用户将不知道输入什么:
input(“请输入两个数字(行、列)”)
等等。最好为格式错误的输入添加错误处理,并通常创建一个愉快的用户体验。代码重新定义了内部
map
函数——选择另一个变量名。沙迪:你应该给出触发错误的输入。正如@SamDaniel所指出的,如果第一行传递了一个int,那么它就会触发错误。如果接收到2个值,那么就可以了。代码的使用乍一看并不明显。当给出python错误时,告诉我们哪一行;这会让一切变得更容易。欢迎来到StackOverflow。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确指定问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您指定的问题。你的代码不是最小的;当错误涉及第24行的三个变量时,为什么会有所有这些输入和设置代码?
['*', 2, '*']
[2, 3, 2]
[2, '*', 3]
[2, '*', '*']