python编码对网格的行和列求和

时间:2015-06-14 02:26:40

标签: python

我正在尝试在python编码中使用电子表格格式。 试图教我的初中学生如何从matrix.txt文件中读取表格并生成一组行和列。然后,我想让他们看看每列的总和是否与给定的总和相匹配,并且相同。 这是我在matrix.txt文件中的内容

3 3
7 2 5 14
6 3 1 10
3 9 8 20
16 14 14

这是我到目前为止构建的代码,但我无法理解如何让程序计算每行前三(行数)整数的总和。 希望有人可以提供帮助。

k=[]
with open('matrix.txt') as f:
  grid_data = [i.split() for i in f.readlines()]
for el in grid_data[0:]:
  for num in el[0]:
     k.append(num)
row=int(k[0])
for i in range(1,row):
  for el in grid_data[i]:
    print(sum(el[0:row-1])) 

如果有更好的解决方法,请告诉我。这是2014年以前的新南威尔士大学编码补充问题。我希望用python方法分析表格或网格。

2 个答案:

答案 0 :(得分:3)

对于这样一个简单的问题,Numpy完全矫枉过正,并要求你向年轻学生抛弃一大堆额外的背景知识。

我一般不喜欢用勺子喂食,但是有太多的元素可以用pythonic解决方案在散文中解释,所以这里是代码:

with open('matrix.txt') as f:
    # Skip dims because redundant.
    f.readline()

    # Convert to int as we read.
    grid = [map(int, i.split()) for i in f]

# Define convenience vars (also for efficiency - rows is evaluated twice).
rows = grid[:-1]
totals = grid[-1]

# Verify row totals.
for (r, row) in enumerate(rows):
    assert sum(row[:-1]) == row[-1], 'row {}'.format(r)

# Verify column totals.
for (c, total) in enumerate(totals):
    assert sum(row[c] for row in rows) == total, 'col {}'.format(c)

编辑: Blue reminded me用于转置数组的非常好的pythonic技巧。最终结果更优雅:

# Replace convenience down with…

# Verify row totals.
for (r, row) in enumerate(grid[:-1]):
    assert sum(row[:-1]) == row[-1], 'row {}'.format(r)

# Verify column totals.
for (c, col) in enumerate(zip(*grid)[:-1]):
    assert sum(col[:-1]) == col[-1], 'col {}'.format(c)

唯一的警告(以及我保留原始原封的原因)是它可能会爆炸普通的初中级大脑。请谨慎使用。

答案 1 :(得分:1)

您似乎对matrix.txt文件有问题,因为您在每行中没有相同数量的元素。我在这里假设方阵,就像这个

3 3 0 0
7 2 5 14
6 3 1 10
3 9 8 20
16 14 14 0

然后使用列表理解和转置概念(可能是学生的教学好处)的可能解决方案是这个

with open("matrix.txt") as f:
    content = f.readlines()

# convert matrix data to integers

matrix = [[int(i) for i in line.split()] for line in content]


# sum the rows

print('sum of lines')

for line in matrix:
    print(sum(line))

# transpose the matrix

transpose_matrix = list(zip(*matrix))

# do the same with the transposed matrix

print('sum of rows')

for line in transpose_matrix:
    print(sum(line))

结果如下:

some of lines
6
28
20
40
44
sum of rows
35
31
28
44