我认为一个接一个地分解你的尝试,并讨论每一个尝试中出现的问题是有指导意义的。在
对于初学者来说,您的输入列表是一个二维的数字列表。你需要把它们投给int,最好是马上就投。但是,我假设您在代码中使用的输入列表如下所示:[['1', '1', '-2'], ['-1', '-2', '-3'], ['1', '1', '1']]
它需要将其元素强制转换为int以避免崩溃。在
尝试1
您的代码:
^{pr2}$
主要的误解是您的语句for row in numbers:循环遍历numbers列表中的实际列表,而不是该列表的索引。换句话说,row在第一次迭代中等于['1', '1', '-2'],而不是{}。在
类似地,for column in numbers:被错误地标记,并且还迭代行列表,而不是行中预期的单元格。当您尝试使用这些项索引到列表numbers时,会发生崩溃。您的代码正在执行以下操作:numbers[['1', '1', '-2']][['1', '1', '-2']] # crash
通过不尝试索引到numbers列表,而是使用row和column元素来计算总数,可以解决这个问题。在
您还存在一个逻辑错误,该错误过早地将rowtotal添加到聚合total中,这会超出计数。在
最后,前两行什么也不做,因为循环变量覆盖了值;删除它们。在
以下是重写:total = 0
for row in numbers:
rowtotal = 0
for column in row: # < iterating cells in rows
rowtotal = rowtotal + int(column) # < much better
total = total + rowtotal # < logic error fixed
print(total)
尝试2
您的代码:row = len(numbers)
column = len(numbers[0])
total = 0
for row in range (len(numbers)):
for col in range(len(numbers[0])):
total = total + numbers[row][column] # < crash!
print(total)
和第一个问题类似。在开头有两行引入变量row和{}。当您编写for row in range(len(numbers)):时,您将重写在第1行初始化的row变量。在
但是,当您编写for col in range(len(numbers[0])):时,您并没有重写column,而是试图使用存储列表长度的越界变量{}索引到{},该变量存储了列表的长度,导致程序崩溃。在
当然,如果您还没有转换到int,请不要忘记转换到int。在
固定的:total = 0
for row in range(len(numbers)):
for col in range(len(numbers[row])): # added row here in case of a ragged list
total += int(numbers[row][col])
print(total)
尝试3
您的代码:total = 0
for x in range (0, len(numbers)):
rowtotal = 0
for y in range (0, len(numbers[0])):
rowtotal = rowtotal = int(numbers[x][y]) # < typo! = should be +
print(rowtotal)
total = total + rowtotal
print(total)
太近了!这里的问题是您使用了错误的运算符,=,而您的意思是+。我建议继续使用+=运算符,它将右手边的表达式添加到左侧变量,并将其存储在左侧变量中。在
固定的:total = 0
for x in range (0, len(numbers)):
rowtotal = 0
for y in range (0, len(numbers[0])):
rowtotal = rowtotal + int(numbers[x][y]) # or use rowtotal += int(numbers[x][y])
total += rowtotal
print(total)
我的版本
我是这样写的:print(sum([sum([int(n) for n in row]) for row in numbers]))
这使用了一个叫做列表理解的东西,它基本上是一个创建列表的单行for循环。在
正如@jpp指出的print(sum([sum(map(int, row)) for row in numbers]))
它甚至更短,使用map函数将int强制转换应用于row的每个元素。在
不要强调这些是否令人困惑,重要的部分是学习如何debug your existing programs,这是所有关于一步一步评估你的假设和通过你的逻辑小块。当你有一个崩溃和一个打印的堆栈跟踪,这是很好的,它告诉你到底是什么地方出了问题,在哪里查找。如果这仍然不能使情况变得清楚,那么将代码简化到它可以正常工作并理解程序状态,然后重新构建。在
这里有一个repl来演示所有的有效解决方案。在