создание списков списков из файла .mtx

#python #python-3.x #function #file

Вопрос:

Я должен написать функцию, которая берет матрицу чисел из Mydata.mtx файла и создает список списков для каждой строки. Файл Mydata.mtx-это всего лишь простой файл с числовой матрицей, как показано ниже

для уточнения приведем матрицу из файла:

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

функция должна возвращать списки списков для каждой строки:

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

Я не могу получить это (выше), но вместо этого продолжаю получать это (ниже):

 [['1', ' ', ' ', ' ', '2', ' ', ' ', ' ', '3', ' ', ' ', ' ', '4', ' ', ' ', ' ', '5', 'n'], ['6', ' ', ' ', ' ', '7', ' ', ' ', ' ', '8', ' ', ' ', ' ', '9', ' ', ' ', ' ', '1', '0', 'n'], ['1', '1', ' ', ' ', '1', '2', ' ', ' ', '1', '3', ' ', ' ', '1', '4', ' ', ' ', '1', '5', 'n']]
 

вот код:

 #print statements are just to see what my output would be
def readMatrix(filename):
    listOfLists = []
    file = open(filename, "r")
    for i in file:
        iList = list(i)
        listOfLists.append(iList)
    print(listOfLists)



callFile = input("Enter the file name: ")
toReadFile = readMatrix(callFile)
 

дополнительная информация:

вторая функция должна транспонировать эту матрицу

после чего третья функция создает новый файл T.Mydata.mtx

(но я могу попытаться разобраться в этом позже. моя главная проблема-это первая функция

Комментарии:

1. Где ваш код? Похоже, вам просто нужно убрать пробелы.

2. @PaulRooney да, извините, я забыл добавить.. это должно быть там сейчас

Ответ №1:

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

 def readMatrix(filename):
    listOfLists = []
    with open(filename) as f:
        for i in f:
            listOfLists.append(i.split())
    return listOfLists


callFile = input("Enter the file name: ")
toReadFile = readMatrix(callFile)
print(toReadFile)
 

Это также можно было бы выразить более сжато, используя понимание списка.

 def readMatrix(filename):
    with open(filename) as f:
        return [line.split() for line in f]
 

Комментарии:

1. Большое вам спасибо за вашу помощь. Я очень признателен вам за это

2. О, я об этом не знал. просто подумал, что str.split() на самом деле равно str.split(‘ ‘)

3. Я добавил ссылку на документы, которая объясняет это. Кроме того, если вы хотите транспонировать матрицу, можете ли вы использовать numpy или хотите реализовать ее самостоятельно?

4. извините за поздний ответ. Я пытаюсь решить этот код без использования импорта. Я использовал [list(i) for i in zip(*M)] во второй функции транспонирование матрицы. пока это работает, но нужно было бы изменить его, чтобы он тоже принимал пустые матрицы

5. Как выглядит пустая матрица? Это [] [[]] или что-то другое?

Ответ №2:

Проблема:

Похоже, у вас есть несколько лишних мест

Решение:

 import re

# should be imported from the file
m = """1   2   3   4   5
6   7   8   9   10
11  12  13  14  15"""

m = re.sub('  ', ' ', m) # replaces extra spaces with one single space

numbers = list(map(lambda row: row.split(' '), m.split('n')))
# numbers == [['1', '2', '3', '4', '5'], ['6', '7', '8', '9', '10'], ['11', '12', '13', '14', '15']]
 

Комментарии:

1. Большое вам спасибо, но есть ли способ обойтись без импорта?