2014-10-20 4 views
0

Это для моего класса ИТ, я пытаюсь найти сумму каждой строки. Это волшебная квадратная программа. когда я запускаю это, он говорит, что объект int не является итерируемым. Также учителю нужен заголовок функции, такой как def rowSum (matrix, rowNum), но я не понимаю, зачем нужен rowNum. Функция должна иметь возможность вычислять сумму каждой строки любой матрицы размера. Также я не могу использовать numpy и enumarate, поскольку мы еще не говорили об этом в классе.Python чтение матрицы из файла

Матрица TXT файл:

1 4 
3 2 

Вот код

def main(): 
    filNam = "matrix1.txt" 
    matrix = (readMatrix(filNam)) 
    print(eachNumPresent(matrix)) 
    print(rowSum(matrix)) 

def readMatrix(filNam): 
    matrixFile = open(filNam, "r") 
    line = matrixFile.readline() 
    for line in matrixFile: 
     line = line.split() 
    return line 
    matrixFile.close() 

def eachNumPresent(matrix): 
    if len(matrix) % 2 == 0: 
     return True 
    else: 
     print("Not enough numbers") 

def rowSum(matrix, rowNum): 
    for line in matrix: 
     return(sum(int(line))) 

main() 
+0

Кто-то (кажется, что он одноклассник) задал тот же вопрос несколько часов назад, попробуйте проверить эту тему :: http://stackoverflow.com/questions/26457089/magic-square-algorithm – user3378649

+0

Имеет ли rowNum ссылку на количество строк в матрице? – Totem

+0

он написал эту строкуSum (matrix, rowNum) \t: возвращает сумму указанной строки матрицы –

ответ

1

Как об этом, он предполагает, что, когда вы хотите, чтобы первый ряд, то введите «0», если вы хотите вторую строку вы бы набрали «1» и т. д. ... легко изменились.

def main(): 
    fn = "matrix1.txt" 
    matrix = readMatrix(fn) 
    n = int(input("Enter row number: ")) 
    rowSum(matrix, n) 

def readMatrix(fn): 
    matrix = [] 
    with open(fn) as f: # a with block will auto close your file after the statements within it 
     for line in f: 
      line = line.strip() # strip off any trailing whitespace(including '\n') 
      matrix.append(line.split()) 
    return matrix 

def rowSum(matrix, rowNum): 
    result = sum(int(i) for i in matrix[rowNum]) 
    print("The sum of row {} = {}".format(rowNum, result)) 

main() 

Пример вывода:

The sum of row 1 = 5 

РЕДАКТИРОВАТЬ:

Для того, чтобы вычислить сумму столбца:

def main(): 
    fn = "matrix1.txt" 
    matrix = readMatrix(fn) 
    n = int(input("Enter col number: ")) 
    colSum(matrix, n) 

def readMatrix(fn): 
    matrix = [] 
    with open(fn) as f: # a with block will auto close your file after the statements within it 
     for line in f: 
      line = line.strip() # strip off any trailing whitespace(including '\n') 
      matrix.append(line.split()) 
    return matrix 

def colSum(matrix, colNum): 
    result = sum(int(row[colNum]) for row in matrix) 
    print("The sum of col {} = {}".format(colNum, result)) 

main() 
+0

ОК спасибо, что похоже на работу. Чтобы вычислить суммы столбцов, я бы сделал то же самое, что и rowSum, но вместо i в матрице ([rowNum]) это было бы для j в матрице ([colNum])? –

+0

Я снова включил тот же код, но на этот раз он суммирует выбранный столбец. – Totem

0

1.you может узнать панд

2. ваш код имеет ошибку, ее е мой код

def main(): 
    filNam = "matrix1.txt" 
    rowNum, matrix = (readMatrix(filNam)) 
    print(eachNumPresent(rowNum)) 
    rowSum(matrix) 

def readMatrix(filNam): 
    matrix_list = [] 
    total_num = 0 
    with open(filNam, 'r') as matrixFile: 
     for line in matrixFile.readlines(): 
      line = line.split() 
      line = [int(i) for i in line] 
      matrix_list.append(line) 
      total_num += len(line) 
    return total_num, matrix_list 

def eachNumPresent(num): 
    if num % 2 == 0: 
     return True 
    else: 
     print("Not enough numbers") 

def rowSum(matrix): 
    for row in matrix: 
     print sum(row) 

main() 

из:

True 
5 
5 
+0

как бы вы делали столбцы, если бы вы делали такие строки –

+0

, вы можете использовать numpy или pandas для вычисления столбцов – Dyue

+0

это для класса, и мы не можем использовать pandas или numpy, так как мы hadvent говорили о них в классе –

1

Вы не итерация в правильной последовательности, вы использовали «Readline» вместо «readlines», который только для чтения одной из линий а не полный файл. То, что вы хотели сделать, это прочитать все строки и преобразовать эти строки в списки, чтобы вы могли использовать sum() на нем. Обратите внимание, что после раскола вам нужно убедиться, что вы преобразовываете полученные строки в int. При этом вы формируете матрицу в виде списка списков (в формате [[1,2], [3,4]]), и затем вы можете передать номер строки (начиная с нуля, но можно отрегулировать) до rowSum (вот почему ваш учитель дал вам этот формат)

См. различия в скорректированном примере (я изложил шаги для преобразования, например, в разных операциях, но вы можете фактически реорганизовать этот код для его получения сделанные в меньших количествах):

def main(): 
    filNam = "matrix1.txt" 
    matrix = (readMatrix(filNam)) 
    print(eachNumPresent(matrix)) 
    print(rowSum(matrix, 0)) 

def readMatrix(filNam): 
    with open(filNam, 'r') as matrixFile: 
     matrix = [] 
     lines = matrixFile.readlines() 
     for line in lines: 
      items = line.split() 
      numbers = [int(item) for item in items] 
      print numbers 
      matrix.append(numbers) 
     return matrix 

def eachNumPresent(matrix): 
    if len(matrix) % 2 == 0: 
     return True 
    else: 
     print("Not enough numbers") 

def rowSum(matrix, rowNum): 
    for line in matrix: 
     return(sum(line)) 

main() 

Если вам нужно какое-либо разъяснение, просто дайте мне знать ... Надеюсь, это поможет!

+0

Я не думаю, что он хотел введите строку, потому что это для магической квадратной программы. Предположим, что сумма каждой строки, столбца и двух диагнозов одинакова. –

+0

В этом случае вы можете изменить приведенный выше код, чтобы также отслеживать столбцы, так как они уже находятся в списках и повторяются так, как вы хотите через него , Но, указав номер строки, он получает определенную функциональность, которую можно фактически портировать в столбцы и т. Д., И использовать эти методы в качестве основы для полной проверки всех сумм, с тем чтобы быть модульным и легко изменить поведение при необходимости (или проанализировать его). Оттуда вы можете сделать colSum (matrix, rowNum), вы даже можете заставить их также проверить суммы их соответствующих диагоналей. Или уточните с ним, почему бы не сделать это за один шаг. – jcabrera

Смежные вопросы