Mike
Mike

Reputation: 13

Multiline printing in a "for" loop

I'm trying to print a multiline string in a "for" loop. The problem is I'd like to have the output printed all on the same lines. Example:

for i in range(5):
print('''
{a}
|
{b}
'''.format(a=i,b=i+1))

The output looks like:

0
|
1


1
|
2


2
|
3


3
|
4


4
|
5

Instead I'd like it to be:

0 1 2 3 4
| | | | |
1 2 3 4 5

​But I can't get how to do it. Thanks for the help.

Upvotes: 1

Views: 2556

Answers (6)

Tim
Tim

Reputation: 2592

Try with list concaternation:

x = 5

print (" ".join(str(i) for i in range(x)))
print ('| '*x)
print (" ".join(str(i) for i in range(1,x+1)))

Upvotes: 4

Yaelle
Yaelle

Reputation: 391

What's your goal here? If, for example, you print up to n>9, your formatting will be messed up because of double digit numbers.

Regardless, I'd do it like this. You only want to iterate once, and this is pretty flexible, so you can easily change your formatting.

lines = ['', '', '']  
for i in range (5):  
    lines[0] += '%d ' % i  
    lines[1] += '| '  
    lines[2] += '%d ' % (i+1)  
for line in lines:  
    print line  

Upvotes: 0

user2390182
user2390182

Reputation: 73450

Similar to Tim's solution, just using map instead of the genrators, which I think is even more readable in this case:

print(" ".join(map(str, range(i))))
print("| " * i)
print(" ".join(map(str, range(1, i+1))))

or alternatively, less readable and trickier, a heavily zip-based approach:

def multi(obj):
    print("\n".join(" ".join(item) for item in obj))

r = range(6)
multi(zip(*("{}|{}".format(a, b) for a, b in zip(r, r[1:]))))

Upvotes: 0

Thijs van Dien
Thijs van Dien

Reputation: 6616

You can only print one line at a time. So first you'll have to print the line with all the a elements, then the line with all the bars, and finally the line with all the b elements.

This can be made easier by first preparing every line before printing it:

line_1 = ""
line_2 = ""
line_3 = ""
for i in range(5):
    line_1 += str(i)
    line_2 += "|"
    line_3 += str(i+1)
print(line_1)
print(line_2)
print(line_3)

There are of course many ways with the same basic idea. I picked the one that is (IMHO) easiest to understand for a beginner.

I didn't take spacing into account and once you do, it gets beneficial to use lists:

line_1_elements = []
line_2_elements = []
line_3_elements = []
for i in range(5):
    line_1_elements.append(str(i))
    line_2_elements.append("|")
    line_3_elements.append(str(i+1))
print(" ".join(line_1_elements))
print(" ".join(line_2_elements))
print(" ".join(line_3_elements))

Upvotes: 0

Davis Yoshida
Davis Yoshida

Reputation: 1785

Just to throw in a fun (but bad, don't do this) answer:

for i in range(5):
    print('{}\033[1B\033[1D|\033[1B\033[1D{}\033[2A'.format(i, i+1), end='')
print('\033[2B')

This uses terminal control codes to print column by column rather than row by row. Not useful here but something that's good to know about for when you want to do weirder terminal manipulation.

Upvotes: 0

doubleui
doubleui

Reputation: 556

import sys

myRange = range(5)

for i in myRange:
    sys.stdout.write(str(i))
print()
for i in myRange:
    sys.stdout.write('|')
print()
for i in myRange:
    sys.stdout.write(str(i+1))
print()

You need sys.stdout.write to write without \n. And this code will not work if you have range more than 9 (10+ has 2+ chars, so you need special rules for spaces before |).

Upvotes: 1

Related Questions