Форматирование неизвестного вывода в таблице в Python - PullRequest
0 голосов
/ 30 января 2020

Помощь! Я новичок Python, которому дано задание отображать последовательность Коллатца из целого числа, введенного пользователем, и отображать содержимое в столбцах и строках. Как вы, наверное, знаете, результаты могут быть 10, 30 или 100. Я должен использовать '\ t'. Я перепробовал много вариантов, но в лучшем случае получил только один столбец. например,

def sequence(number):
    if number % 2 == 0:
        return number // 2    
    else:
        result = number * 3 + 1
        return result


n = int(input('Enter any positive integer to see Collatz Sequence:\n'))
while sequence != 1:
    n = sequence(int(n))
    print('%s\t' % n)
    if n == 1:
        print('\nThank you! The number 1 is the end of the Collatz Sequence')
        break

, который дает один вертикальный столбец, а не результаты отображаются горизонтально. В идеале я хотел бы отобразить 10 результатов слева направо, а затем go в другой строке. Спасибо за любые идеи!

1 Ответ

1 голос
/ 30 января 2020

Примерно так:

def get_collatz(n):
    return [n // 2, n * 3 + 1][n % 2]

while True:
    user_input = input("Enter a positive integer: ")
    try:
        n = int(user_input)
        assert n > 1
    except (ValueError, AssertionError):
        continue
    else:
        break

sequence = [n]
while True:
    last_item = sequence[-1]
    if last_item == 1:
        break
    sequence.append(get_collatz(last_item))

print(*sequence, sep="\t")

Вывод:

Enter a positive integer: 12
12  6   3   10  5   16  8   4   2   1
>>> 

РЕДАКТИРОВАТЬ Попытка сохранить его похожим на ваш код:

Я бы изменил вашу sequence функцию на что-то вроде этого:

def get_collatz(n):
    if n % 2 == 0:
        return n // 2
    return n * 3 + 1

Я назвал это get_collatz, потому что я думаю, что это более наглядно, чем sequence, хотя это все еще не очень хорошее имя - если вы хотел быть очень явным, может быть get_collatz_at_n или что-то в этом роде.

Обратите внимание, я полностью удалил ветку else, поскольку она не требуется. Если n % 2 == 0, то мы возвращаемся из функции, поэтому либо вы возвращаетесь в теле if, либо возвращаете одну строку ниже - не нужно else.

В остальном, может быть:

last_number = int(input("Enter a positive integer: "))
while last_number != 1:
    print(last_number, end="\t")
    last_number = get_collatz(last_number)

В Python, print имеет необязательный параметр ключевого слова с именем end, который по умолчанию равен \n. Это означает, какой символ должен быть напечатан в самом конце оператора print. Просто изменив его на \t, вы можете распечатать все элементы последовательности в одной строке, разделенные табуляцией (поскольку каждое число в последовательности вызывает отдельную инструкцию print).

Однако при таком подходе Вам нужно будет обязательно распечатать конечный 1 после окончания while l oop, поскольку l oop завершится, как только last_number станет 1, что означает, что l oop не сможет распечатать его.

Другой способ печати последовательности (с разделительными вкладками) - сохранить последовательность в списке, а затем использовать str.join для создания строка из списка, где каждый элемент отделен некоторой строкой или символом. Конечно, для этого необходимо, чтобы все элементы в списке были строками - в этом случае я использую map для преобразования целых чисел в строки:

result = "\t".join(map(str, [12, 6, 3, 10, 5, 16, 8, 4, 2, 1]))
print(result)

Вывод:

12  6   3   10  5   16  8   4   2   1
>>> 
...