Flora Posteschild
Flora Posteschild

Reputation: 75

Formatting unknown output in a table in Python

Help! I'm a Python beginner given the assignment of displaying the Collatz Sequence from a user-inputted integer, and displaying the contents in columns and rows. As you may know, the results could be 10 numbers, 30, or 100. I'm supposed to use '\t'. I've tried many variations, but at best, only get a single column. e.g.

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

Which yields a single vertical column, rather than the results being displayed horizontally. Ideally, I'd like to display 10 results left to right, and then go to another line. Thanks for any ideas!

Upvotes: 0

Views: 314

Answers (1)

Paul M.
Paul M.

Reputation: 10809

Something like this maybe:

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")

Output:

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

EDIT Trying to keep it similar to your code:

I would change your sequence function to something like this:

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

I called it get_collatz because I think that is more descriptive than sequence, it's still not a great name though - if you wanted to be super explicit maybe get_collatz_at_n or something.

Notice, I took the else branch out entirely, since it's not required. If n % 2 == 0, then we return from the function, so either you return in the body of the if or you return one line below - no else necessary.

For the rest, maybe:

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

In Python, print has an optional keyword parameter named end, which by default is \n. It signifies which character should be printed at the very end of a print-statement. By simply changing it to \t, you can print all elements of the sequence on one line, separated by tabs (since each number in the sequence invokes a separate print-statement).

With this approach, however, you'll have to make sure to print the trailing 1 after the while loop has ended, since the loop will terminate as soon as last_number becomes 1, which means the loop won't have a chance to print it.

Another way of printing the sequence (with separating tabs), would be to store the sequence in a list, and then use str.join to create a string out of the list, where each element is separated by some string or character. Of course this requires that all elements in the list are strings to begin with - in this case I'm using map to convert the integers to strings:

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

Output:

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

Upvotes: 1

Related Questions