2016-07-09 3 views
1

Я пытаюсь напечатать многострочную строку в цикле «для». Проблема в том, что я хотел бы, чтобы выходные данные были напечатаны на одинаковых строках. Пример:Многострочная печать в цикле «для»

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

Выход выглядит следующим образом:

0 
| 
1 


1 
| 
2 


2 
| 
3 


3 
| 
4 


4 
| 
5 

Вместо этого я хотел бы, чтобы это было:

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

Но я не могу, как это сделать. Спасибо за помощь.

ответ

4

Try со списком 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))) 
+0

+1 Я чувствую, что это самый пифонический. Я бы сказал, чтобы переключить понимание списков на генераторные выражения. str.join может принимать любые итерации. –

+0

@DavisYoshida Я раньше не встречал генераторные выражения - это просто использование '. '.join (range (x))'? – Tim

+1

@Tim No. Но вы можете просто опустить скобки '[]' и, таким образом, сохранить некоторую память, потому что вы избегаете создания промежуточного списка: «.» .join (str (i) для i в диапазоне (x)) ' – schwobaseggl

0

Вы можете печатать только одну строку за раз. Поэтому сначала вам придется распечатать строку со всеми элементами a, затем со всеми строками и, наконец, с линией со всеми элементами b.

Это можно сделать проще сначала приготовление каждой строки перед печатью:

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) 

Есть, конечно, много способов, с одной и той же основной идеей. Я выбрал тот, который (ИМХО) проще всего понять для новичка.

я не принял во внимание интервал и, как только вы делаете, это становится выгодно использовать списки:

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)) 
1
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() 

Вам нужно sys.stdout.write писать без \n. И этот код не будет работать, если у вас диапазон более 9 (у 10+ есть 2+ символа, поэтому вам нужны специальные правила для пробелов до |).

+0

Может быть, это помогает: 'sys.stdout.write ('|' + '«* (Len (ул (я + 1)) - 1)) ' – doubleui

+3

В Python 3 нет никаких оснований для использования' sys.stdout.Для этого напишите(). Просто выполните 'print (i, end =" ")'. –

+0

@ThijsvanDien на боковой панели, вы также можете импортировать функцию печати в Py2 с помощью 'from __future__ import print_function' –

0

Просто бросить в удовольствие (но плохо, не делайте этого) ответ:

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

Это использует управляющие коды терминала для печати столбец, вместо строки за строкой. Не полезно здесь, а что-то, о чем хорошо знать, когда вы хотите сделать более сложные манипуляции с терминалами.

0

Аналогично решения Тима, просто используя map вместо genrators, которые я думаю, еще более удобные для чтения в этом случае:

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

или альтернативно, менее читаемого и хитроумного, сильно zip основанное подход:

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:])))) 
0

Ваша цель здесь? Если, например, вы печатаете до n> 9, ваше форматирование будет испорчено из-за двузначных чисел.

Независимо от этого, я бы сделал это так. Вы хотите только один раз, и это довольно гибко, поэтому вы можете легко изменить свое форматирование.

lines = ['', '', ''] 
for i in range (5): 
    lines[0] += '%d ' % i 
    lines[1] += '| ' 
    lines[2] += '%d ' % (i+1) 
for line in lines: 
    print line 
Смежные вопросы