Чтение ввода из текста в 2d массив - PullRequest
0 голосов
/ 25 мая 2018

У меня есть текстовый файл с числами в формате пирамиды, такими как:

      5
    10 7
  1  3  12

Я хочу поместить их в двумерный массив (например, в обычную матрицу).Я попробовал пост .но я хочу добавить 0 (ноль) ко всем недостающим позициям.например:

5,0,0
10,7,0
1,3,12

Чтобы сделать это, я должен знать длину последней строки для создания подходящего 2D-массива.

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

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

def last_row_length(filename):
    lastrow = None
    with open(filename, 'r') as f:
        for lastrow in f: pass
    return len(lastrow.split()) if lastrow is not None else 0

lastrowlen = last_row_length('pyramid.txt')
print(lastrowlen)  # -> 3
0 голосов
/ 25 мая 2018

Если вы собираетесь читать файл для создания 2D-массива, вы должны включить определение длины последней строки в создание массива, чтобы вам не приходилось читать файл дважды.

Я предполагаю, что мы заранее не знаем, сколько строк (имеется в виду, что мы не знаем, какова длина каждой стороны матрицы).Я также предполагаю, что ваш файл называется file.txt.

. То, что мы хотим, это рабочий список списков.Прочитав весь файл, мы можем вернуться и добавить завершающие нули.Здесь будет полезен метод split() Python strings, потому что без аргументов этот метод использует пробел в качестве разделителя.Вот простой пример с вашим файлом:

>>> with open('file.txt') as file:
...     for line in file:
...         print(line.split())
... 
['5']
['10', '7']
['1', '3', '12']

Следующий код сохраняет каждый из этих списков как элементы списка с именем rows:

rows = []
with open('file.txt') as file:
    for line in file:
        rows.append(line.split())

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

rows = []
with open('file.txt') as file:
    for line in file:
        rows.append(line.split())
size = len(rows[-1])
for i in range(len(rows)):
    rows[i] = rows[i] + ['0'] * (size - len(rows[i]))
for row in rows:
    print(','.join(row))
0 голосов
/ 25 мая 2018

Количество элементов последней строки - это количество элементов первой строки, когда вы переворачиваете ее, чтобы прочитать.

line.rstrip()

Вы когда-нибудь пробовали это?

...