Создание матрицы с заданным столбцом строки, но с проблемой форматирования вывода - PullRequest
0 голосов
/ 24 февраля 2019

У меня вопрос по созданию матрицы r * c с заданным количеством строк и столбцов.Я написал это, которое занимает r строк и c столбцов, но проблема в форматировании вывода, мне нужен точный формат вывода, и я не могу получить его даже после стольких попыток, если кто-нибудь может мне помочь.

def matprint(r, c):
max = r*c
l=[]
for i in range(1,max+1):
    l.append(i)
subList = [l[n:n+c] for n in range(0, len(l),c)]
for q in subList:
    list1 = q
    print( ( '{} ' * len(list1) ).format( *list1 ) )

enter image description here

см. Разница в том, что мина печатает "\ n" после пробелов, а также в последней строке.это не логичная проблема, просто нужна помощь с форматированием.Спасибо

Ответы [ 2 ]

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

Вы можете обратить проблему:

  • распечатать подсписок, если он первый - без новой строки после него
  • , если он не первый, вывести новую строку с последующейк следующему подсписку

таким образом, ваша последняя строка не должна \n в конце:

def matprint(r, c):
    data = list(range(1,r*c+1))               
    l= [data[i*c:i*c+c] for i in range(r)]

    formatter = ('{} ' * c).strip()     # create the format string once - strip spaces at end

    for i,sublist in enumerate(l):
        if i: # 0 is False, all others are True
            print("")
        print( formatter.format( *sublist ), end="" ) # do not print \n at end


matprint(3, 5)

Я также немного оптимизировал код - вы не должныиспользуйте такие вещи, как max,min,list,dict,... в качестве имен переменных - они скрывают встроенные функции с одинаковыми именами.

Построение вашего списка можно упростить с помощью понимания списка, которое разбивает ваш список чисел - см. Как разбить список на куски одинакового размера? .

Вам не нужно пересчитывать длину вашего подсписка - это c long.

Вам нужно индекс из enumerate(), чтобы решить, является ли список«first» - и вам нужно параметр end="" печати , чтобы избежать автоматической печати новых строк.


Более простую версию без перечисления можно сделать с помощью нарезки списка:

def matprint(r, c):
    data = list(range(1,r*c+1))
    l= [data[i*c:i*c+c] for i in range(r)]
    formatter = ('{} ' * c).strip()     # create the format string once - strip spaces at end

    print(formatter.format(*l[0]), end="")  # print the 1st element w/o newline
    for sublist in l[1:]: 
        # print all others including a \n in front
        print( "\n"+formatter.format( *sublist ), end="" ) # do not print \n at end
0 голосов
/ 24 февраля 2019

Вы должны использовать str.join, чтобы присоединиться к списку строк.

Этот код создает строку элементов из list1, разделенных ' ', но также добавляет пробел в конце:

print( ( '{} ' * len(list1) ).format( *list1 ) )

Вместо этого сделайте следующее:

list_of_strings = [str(x) for x in list1]
print(' '.join(list_of_strings))

Или, более компактно:

print(' '.join(str(x) for x in list1))

У вас та же проблема с символами новой строки.print добавляет их после каждой строки.Вы не хотите, чтобы они были после последней строки, поэтому вы должны также объединить строки и затем напечатать их без новой строки:

lines = [' '.join(str(x) for x in list1) for list1 in subList]
sys.stdout.write('\n'.join(lines))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...