Python中的2D列表(行总数/行总数)

时间:2018-09-21 17:27:30

标签: python

我的问题是关于获取2d列表中每一行的总和,然后获取所有行的总和。以下是提供给我的信息-

我们将传递二维数字列表。 您应该:

*将每一行中的所有数字相加并输出该数字

*输出所有行的总计

这是给我的代码:

# Get our list from the command line arguments
import sys
numbers= sys.argv[1:]

# Convert the command line arguments into 2d list
for i in range(0,len(numbers)): 
    numbers[i]= numbers[i].split(',')

这项工作已通过Codio完成。当我打印二维列表时,这是我得到的输出:

print(numbers)
[['1', '1', '-2'], ['-1', '-2', '-3'], ['1', '1', '1']]

基于我以前工作过的问题和方案,这些数字已经根据我开发的编码进行了更改,以确保其符合作业的所有准则。

我尝试了各种尝试来解决此问题,如下所示:

row = len(numbers)
column = len(numbers[0])
total = 0

for row in numbers:
    rowtotal = 0
    for column in numbers:
        rowtotal = rowtotal + numbers[row][column]
        print(rowtotal)
        total = total + rowtotal
print(total)

这给出了错误:

Traceback (most recent call last):
  File "list.py", line 17, in 
    rowtotal = rowtotal + numbers[row][column]
TypeError: list indices must be integers, not list

我也尝试过:

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]
print(total)

哪个给我错误:

Traceback (most recent call last):
  File "list.py", line 16, in 
    total = total + numbers[row][column]
IndexError: list index out of range

我最后一次尝试是:

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])
    print(rowtotal)
    total = total + rowtotal
print(total)

最终给了我一些数字,但没有给出正确的数字:

Program Failed for Input: 1,1,-2 -1,-2,-3 1,1,1
Expected Output: 0
-6
 3
-3
Your Program Output: -2
-3
 1
-4

如果能得到任何帮助,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

我认为将您的尝试一一分解并讨论每个尝试中出了什么问题是有益的。

对于初学者而言,您的输入列表是二维数字列表,以字符串形式 。您需要将它们投放到int,最好是马上就投放。但是,我假设您在代码中使用的输入列表如下:

[['1', '1', '-2'], ['-1', '-2', '-3'], ['1', '1', '1']]

需要将其元素强制转换为int以避免崩溃。


尝试1

您的代码:

row = len(numbers)
column = len(numbers[0])
total = 0

for row in numbers:
    rowtotal = 0
    for column in numbers: # <-- are these really columns as advertised or still rows?
        rowtotal = rowtotal + numbers[row][column] # <-- crash!
        print(rowtotal)
        total = total + rowtotal # <-- are you sure you want to do this here?
print(total)

主要的误解是您的语句for row in numbers:遍历numbers列表中的实际列表,而不是该列表的索引。换句话说,row在第一次迭代中等于['1', '1', '-2'],而不是0

类似地,for column in numbers:的标签错误,并且还会遍历行列表而不是行中的预期单元格。当您尝试使用这些项目索引到列表numbers时,会发生崩溃。您的代码正在执行:

numbers[['1', '1', '-2']][['1', '1', '-2']] # crash

您可以通过不尝试索引到numbers列表中而是使用rowcolumn元素计算总数来解决此问题。

您还存在一个逻辑错误,该错误将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)

这里是第一个类似的问题。开头有两行介绍了变量rowcolumn。编写for row in range(len(numbers)):时,将覆盖在第1行初始化的row变量。

但是,当您写for col in range(len(numbers[0])):时,您不要覆盖column,并尝试使用{{1 }}变量,它存储列表的长度,使程序崩溃。

当然,如果您还没有这么做,请不要忘记转换为numbers

已修复:

column

尝试3

您的代码:

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) 时使用了错误的运算符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) 循环。

@jpp指出,

print(sum([sum([int(n) for n in row]) for row in numbers]))

甚至更短,使用for函数将print(sum([sum(map(int, row)) for row in numbers])) 强制转换应用于map的每个元素。

请不要担心这些是否会引起混淆-重要的部分是学习如何debug your existing programs,这都是关于逐步评估假设并逐步细化逻辑的全部内容。当您遇到崩溃并打印了堆栈跟踪时,这很好–它可以准确告诉您出了什么问题以及在哪里查看。如果仍然不能解决问题,请将代码简化到可以正常工作的位置,并且您了解程序状态,然后重新构建。

这里是repl,可以使用所有可行的解决方案。

答案 1 :(得分:1)

我是该站点的新手,因此无法对标记为已接受的用户答案发表评论,但我注意到代码中存在问题。它仅输出所提出问题的一部分。原始代码为:

total = 0

for row in numbers:
    rowtotal = 0

   for column in row:  
       rowtotal = rowtotal + int(column) 

total = total + rowtotal  

print(total)

但是它还需要打印“行总数”,因此问题的答案将是另外一行这样的代码:

total = 0

for row in numbers:
    rowtotal = 0

   for column in row: 
       rowtotal = rowtotal + int(column) 
   print(rowtotal) # <---- New line of code
total = total + rowtotal 

print(total)

现在它可以在Codio环境中通过了,因为两个输出都可以打印。1)每行的总数和2)所有行的总数。我希望这对同时使用Codio IDE上课并遇到这一挑战的所有人有所帮助。和往常一样,有多种方法可以简化代码,但是如果您在课程的此阶段,可能超出了您的范围。

答案 2 :(得分:0)

您可以利用python list comprehension和内置的sum函数轻松完成此操作:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
row_totals = [sum(row) for row in matrix]
grand_total = sum(row_totals)

或者,您可以使用香草循环和加法:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
row_totals = []
grand_total = 0
for row in matrix:
    row_total = 0
    for value in row:
        row_total += value
    row_totals.append(row_total)
    grand_total += row_total