Строка для n * n матрицы в Python - PullRequest
0 голосов
/ 15 февраля 2019

Я студент, который любит программирование.Я столкнулся с проблемой сегодня, и я не знаю, как решить эту проблему.Я искал "Python - представление строки в матрицу" ( Python - представление строки в матрицу ) для справки, но я все еще запутался в этой проблеме.

Проблема заключается в следующем:

Учитывая строку чисел, разделенных пробелами, создайте матрицу nxn (двумерный список с таким же количеством столбцов, что и строк) и верните его.Строка будет содержать идеальное квадратное число целых чисел.Функции int () и split () могут быть полезны.

Пример:

Ввод: '1 2 3 4 5 6 7 8 9'

Выход: [[1,2,3], [4,5,6], [7,8,9]]

Пример 2:

Ввод: '1'

Выход: [[1]]

Myответ:

import numpy as np
def string_to_matrix(str_in):
    str_in_split = str_in.split()
    answer = []
    for element in str_in_split:
        newarray = []
    for number in element.split():
        newarray.append(int(number))
    answer.append(newarray)
    print (answer)

Результаты теста следующие:

Traceback (most recent call last):
  File "/grade/run/test.py", line 20, in test_whitespace
    self.assertEqual(string_to_matrix('1      2 3   4'), [[1,2],[3,4]])
AssertionError: None != [[1, 2], [3, 4]]

Stdout:
[[4]]

, а также

Traceback (most recent call last):
  File "/grade/run/test.py", line 15, in test_small
    self.assertEqual(string_to_matrix('1 2 3 4'), [[1,2],[3,4]])
AssertionError: None != [[1, 2], [3, 4]]

Stdout:
[[4]]

и

Traceback (most recent call last):
  File "/grade/run/test.py", line 10, in test_one
    self.assertEqual(string_to_matrix('1'), [[1]])
AssertionError: None != [[1]]

Stdout:
[[1]]

а также

Traceback (most recent call last):
  File "/grade/run/test.py", line 25, in test_larger
    self.assertEqual(string_to_matrix('4 3 2 1 8 7 6 5 12 11 10 9 16 15 14 13'), [[4,3,2,1], [8,7,6,5], [12,11,10,9], [16,15,14,13]])
AssertionError: None != [[4, 3, 2, 1], [8, 7, 6, 5], [12, 11, 10, 9], [16, 15, 14, 13]]

Stdout:
[[13]]

Я все еще не понимаю, как решить эту проблему.Большое спасибо за Вашу помощь!

Ответы [ 6 ]

0 голосов
/ 15 февраля 2019
import math
string = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16"
stringItems = string.split(" ")
numberOfItems = len(stringItems)
if math.sqrt(numberOfItems) - int(math.sqrt(numberOfItems)) == 0:
    width = int(math.sqrt(numberOfItems))
    array = []
    finalArray = []
    for i in range (0, width):
        for j in range (0, width):
            array.insert(j, stringItems[0])
            stringItems.pop(0)
        finalArray.insert(i, array)
        array = []
    print finalArray
else:
    print "I require a string with length equal to a square number please"
0 голосов
/ 15 февраля 2019
import numpy as np
def string_to_matrix(str_in):
   str_in_split = str_in.split()
   numbers = list(map(int, str_in_split))
   size = r_shape = int(np.sqrt(len(numbers)))
   return np.array(numbers).reshape(r_shape, r_shape)

Вот почему вы всегда получаете: AssertionError: None != ...

assertEqual(A, string_to_matrix("...")) проверяет, равно ли A значению, возвращаемому string_to_matrix.В вашем коде вы ничего не возвращаете, поэтому оно равно None

Другая проблема заключается в том, как вы разбили строку, более простые варианты - разделить все и преобразовать в число, а затем преобразовать в sqrt (числоэлементов).Это предполагает, что входная длина может быть разделена для формирования матрицы nxn

0 голосов
/ 15 февраля 2019

Предполагая, что вы не хотите numpy и хотите использовать список списков:

def string_to_matrix(str_in):
    nums = str_in.split()
    n = int(len(nums) ** 0.5)
    return list(map(list, zip(*[map(int, nums)] * n)))

nums = str_in.split() разбивает на любые пробелы, n - длина стороны результата, map(int, nums) преобразует числа в целые числа (из строк), zip(*[map(int, nums)] * n) группирует числа в группы по n, list(map(list, zip(*[map(int, nums)] * n))) преобразует кортежи, созданные с помощью zip, в списки.

0 голосов
/ 15 февраля 2019

Предполагая, что вы хотите сделать это динамическим.

str_in = '1 2 3 4 5 6 7 8 9'
a = str_in.split(" ")
r_shape = int(math.sqrt(len(a)))
np.array([int(x) for x in a]).reshape(r_shape, r_shape)
0 голосов
/ 15 февраля 2019

Учитывая, что вы будете всегда получать идеальное квадратное число целых:

import numpy as np

input_strings = '1 2 3 4 5 6 7 8 9'
arr = np.array(input_strings.split(), dtype=int)
n = int(len(arr) ** 0.5)
arr.reshape(n, n)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

Примечание: в вашем случае str.split лучше без явного sep, чтобыотлично работает с несколькими пробелами между цифрами.

0 голосов
/ 15 февраля 2019

Используйте split, создайте массив 1D Numpy, затем используйте reshape:

>>> s = '1 2 3 4 5 6 7 8 9'
>>> np.array([s.split(), dtype=int).reshape(3,3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

Если вы не знаете размер массива, но знаете, что он квадратный (такой же ширины / высоты), затем вы можете использовать math.sqrt, чтобы получить входные данные для reshape:

>>> import math
>>> s = '1 2 3 4 5 6 7 8 9'
>>> arr = np.array(s.split(), dtype=int)
>>> size = int(math.sqrt(len(arr)))
>>> arr.reshape(size, size)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...