У меня проблемы с сохранением в списке целых чисел, взятых из файла - PullRequest
0 голосов
/ 27 октября 2019

упражнение просит нас проверить, являются ли числа, содержащиеся в файле, магическим квадратом или нет.

Прежде всего, я пытаюсь создать список со всеми значениями, которые затем преобразую в матрицу и затем проверим if sum of first row == sum first column == sum of diagonal.

Моя задача гораздо проще, чем упражнение:

Список L - это тот, который я изменю в матрице, но я бы хотел, чтобы он был чистым, мне удалось получить его как L=[7,1,2,1,1,4,"\n" and so on], но я пытаюсь сохранить 1,2 как12 и 1,4 как 14.

Я пытался сделать это следующим образом, но я вывел индекс str вне диапазона, что кажется странным, поскольку я всячески пытался сохранить indexes < than len-1,Не могли бы вы посмотреть?

Я знаю, что могут быть другие способы реализации упражнения, но в данный момент меня интересует, как редактировать список L в LI = [7, 12, 1, 14, "\ n ", 2, 13, 8, 11," \ n ", 16, 3, 10, 5," \ n ", 9, 6, 15, 4]

L=['7', ' ', ' ', ' ', ' ', '1', '2', ' ', ' ', ' ', ' ', '1', ' ', ' ', ' ', ' ', '1', '4', '\n', '2', ' ', ' ', ' ', ' ', '1', '3', ' ', ' ', ' ', ' ', '8', ' ', ' ', ' ', ' ', '1', '1', '\n', '1', '6', ' ', ' ', ' ', ' ', '3', ' ', ' ', ' ', ' ', '1', '0', ' ', ' ', ' ', ' ', '5', '\n', '9', ' ', ' ', ' ', ' ', '6', ' ', ' ', ' ', ' ', '1', '5', ' ', ' ', ' ', ' ', '4']
    LI=[ ]
    j=len(L)-1
    for i in range(0,j):
        for el in L:
            if el[i]!=" " and el[i+1]!=" ":
                LI.append(el[i]*10+el[i+1])
            elif el!=" ":
                LI.append(el)
    print(LI)

Ошибка -:

---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-164-73294659fea7> in <module>
          4 for i in range(0,j):
          5     for el in L:
    ----> 6         if el[i]!=" " and el[i+1]!=" ":
          7                 L.append(el[i]*10+el[i+1])
          8         elif el!=" ":
          IndexError: string index out of range
***

Ответы [ 3 ]

0 голосов
/ 27 октября 2019
L = ['7', ' ', ' ', ' ', ' ', '1', '2', ' ', ' ', ' ', ' ', '1', ' ', ' ', ' ', ' ',
     '1', '4', '\n', '2', ' ', ' ', ' ', ' ', '1', '3', ' ', ' ', ' ', ' ', '8', ' ',
     ' ', ' ', ' ', '1', '1', '\n', '1', '6', ' ', ' ', ' ', ' ', '3', ' ', ' ', ' ',
     ' ', '1', '0', ' ', ' ', ' ', ' ', '5', '\n', '9', ' ', ' ', ' ', ' ', '6', ' ',
     ' ', ' ', ' ', '1', '5', ' ', ' ', ' ', ' ', '4']

Мы объединяем весь список в строку и затем разделяем его на пробелы.

data = ''.join(L)
print(data)
data = data.split(' ')
print(data)

Результат будет выглядеть следующим образом:

7    12    1    14
2    13    8    11
16    3    10    5
9    6    15    4

['7', '', '', '', '12', '', '', '', '1', '', '', '', '14\n2', '', '', '', '13', '',
 '', '', '8', '', '', '', '11\n16', '', '', '', '3', '', '', '', '10', '', '', '',
 '5\n9', '', '', '', '6', '', '', '', '15', '', '', '', '4']

Похоже, мыдолжны отделить '\n'. Давайте добавим пробелы вокруг символа новой строки перед его разбиением.

data = ''.join(L).replace('\n', ' \n ')
data = data.split(' ')
print(data)

Результат выглядит следующим образом

['7', '', '', '', '12', '', '', '', '1', '', '', '', '14', '\n', '2', '', '', '',
 '13', '', '', '', '8', '', '', '', '11', '\n', '16', '', '', '', '3', '', '', '',
 '10', '', '', '', '5', '\n', '9', '', '', '', '6', '', '', '', '15', '', '', '',
 '4']

Теперь мы создадим новый список, зацикливая этот промежуточный результат. Если мы встретим '', мы проигнорируем его, '\n' будет взят как есть, а все остальное будет преобразовано в целое число.

result = []
for value in data:
    if value != '':
        value = value if value == '\n' else int(value)
        result.append(value)
print(result)

Теперь вы получите желаемый результат.

[7, 12, 1, 14, '\n', 2, 13, 8, 11, '\n', 16, 3, 10, 5, '\n', 9, 6, 15, 4]

С пониманием списка последняя часть может быть написана как одна строка.

result = [value if value == '\n' else int(value) for value in data if value]

Мы могли бы даже собрать все вместе.

result = [value if value == '\n' else int(value) for value in ''.join(L).replace('\n', ' \n ').split(' ') if value]
0 голосов
/ 28 октября 2019

Мне также удалось решить ее по-другому, если вам интересно, вот мой код:

def Magic(file):
    with open("macigsquare.txt") as f:
        mat=[[int(x) for x in lines.split()] for lines in f] #opening my file
        cols=[] #initialiting lists to save sum of rows, sum of cols, sum of diagonal
        rows=[]
        diag=[]
        mat1 = [x for x in mat if x != []] #getting rid of empty lists in my matrix
        n=len(mat1)          #defining n as the length of my matrix
        for j in range(len(mat1[0])):
            r=0      #initialising variables for the sum of each row and diagonal
            d=0
            for i in range (len(mat1)):
                r+=mat1[i][j]     #doing the sum of each row and sum of diagonal
                d+=mat1[i][i]
            cols.append(sum(mat1[i])) #appending the sum of columns
            diag.append(d)   #appending the sum of diagonal
            rows.append(r)   #appending the sum of rows 
            continue
    return sum(cols)==sum(rows) and sum(rows)==sum(diag) and sum(diag)==sum(cols)  #now the result checks if the sum of the three variables is the same, meaning it is a magic square.

Содержимое моего файла было:

 7    12    1    14
2    13    8    11
 16    3    10    5
 9    6    15    4
0 голосов
/ 27 октября 2019

Вам не нужен массив символов для представления матрицы «Магический квадрат», вы можете представить ее непосредственно в коде, используя массив из массива целых чисел, что намного проще и понятнее. Вот код, который вам нужен, написанный на Python, для решения проблемы «Магический квадрат». Функция MagicSquare принимает NxN матрицу, представляющую квадрат (в моем коде это аргумент arr ) и его размерность n и возвращает логическое True , если его магический квадрат False в противном случае.

Общий алгоритм:

def CheckRowsColums(arr, n, s):
    for i in range(0, n):
        row_sum = 0
        col_sum = 0
        for j in range(0, n):
            row_sum += arr[i][j]
            col_sum += arr[j][i]
        if (s != row_sum or s != col_sum):
            return False
    return True

def CheckDiagonals(arr, n, s):
    diag_sum = 0
    for i in range(0, n):
        diag_sum += arr[i][i]
    if (s != diag_sum):
            return False
    return True

def MagicSquare(arr, n):
    s = n * (n**2 + 1) / 2
    return CheckRowsColums(arr, n, s) and CheckDiagonals(arr, n, s)

L = [
        [9, 3, 22, 16, 15], 
        [2, 21, 20, 14, 8], 
        [25, 19, 13, 7, 1], 
        [18, 12, 6, 5, 24], 
        [11, 10, 4, 23, 17]
    ]
print(MagicSquare(L, 5))

Приведенный выше алгоритм имеет сложность O (n * n), которая является квадратичной. РЕДАКТИРОВАТЬ: После уточнения вашего вопроса я понимаю, что вы читаете значения из файла, который представляет матрицу. Предполагая, что формат файла, представляющего матрицу, выглядит следующим образом:

9 3 22 16 15
2 21 20 14 8
25 19 13 7 1
18 12 6 5 24
11 10 4 23 17

Где каждая строка представляет строку нашей квадратной матрицы.

Вы можете прочитать файл и передать его значения для функции, определенной выше, следующим образом:

def Solve(file):
    with open(file) as f: # reading from file each line represents a row of our matrix
        matrix = [[int(x) for x in line.split()] for line in f] # matrix is what you need here
        return MagicSquare(matrix, len(matrix))

fn = input("Enter the filename that represents the square matrix : ")
if Solve(fn):
    print("Magic square !")
else:
    print("It's not a magic square :(")

Программа запросит имя файла после ввода имени файла и нажатия кнопки ввода. обработает файл и распечатает результаты. Обратите внимание: , что этот подход проще, чем чтение файла символьно. Поскольку в python есть встроенная функция для чтения целых чисел непосредственно из входных данных, вы должны использовать их, иначе ваш код будет слишком сложным, если вы решите заново изобрести колесо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...