2013-05-15 2 views
3

У меня есть список, содержащий числа 25-1. Я пытаюсь напечатать его как игровое поле, где все номера совпадают:Список форматирования в python

enter image description here

Я узнал, как добавить строки в список, выполнив this:

_b = map(str, board) 
_board = ' | '.join(_b) 

и я знаю, как печатать 5 номеров на каждой строке. Но у меня возникли проблемы с получением всех номеров. Есть ли способ сделать это?

ответ

4

Если вы знаете, как долго самый длинный номер будет, вы можете использовать любой из этих методов:

строкой «5» и желаемой шириной 3 символов:

  • str.rjust(3) даст строковое ' 5'
  • str.ljust(3) даст строка '5 '
  • str.center(3) даст строку ' 5 '.

Я склонен, как rjust для чисел, так как он выстраивается в таких местах, как вы узнаете, как сделать длиннее дополнение в начальной школе, и это делает меня счастливым;)

Это оставляет вас с чем-то вроде:

_b = map(lambda x: str(x).rjust(3), board) 
_board = ' | '.join(_b) 

или альтернативно, с выражениями генератора:

_board = ' | '.join(str(x).rjust(3) for x in board) 
+1

Одна из незначительных проблем: OP имеет конечные границы, поэтому, если вы собираетесь использовать 'join', вам нужно' + '|' 'после выражения' join'. – abarnert

+0

Я только что перевел его пример кода, я предположил, что он все-таки что-то делал с '_board'. – Crast

1
board = range(25, 0, -1) 
def printLine(): 
    print 
    print "------------------------" 
for c in board: 
    print str(c).ljust(2),'|', 
    if c % 5 == 1: 
     printLine() 

Этот кусок кода должен работать.

+0

вам не нужно печатать плату, хотя – Serial

+1

Извините, что это было заявление отладки .. – albusshin

+1

Зачем вам делать 'str.ljust (str (c), 2)' вместо просто 'str (c) .ljust (2)'? Конечно, вы _can_ вызываете методы таким образом в Python, но почему? – abarnert

3
board = range(1,26) #the gameboard 
for row in [board[i:i+5] for i in range(0,22,5)]: #go over chunks of five 
    print('|'.join(["{:<2}".format(n) for n in row])+"|") #justify each number, join by | 
    print("-"*15) #print the -'s 

Производит

>>> 
1 |2 |3 |4 |5 | 
--------------- 
6 |7 |8 |9 |10| 
--------------- 
11|12|13|14|15| 
--------------- 
16|17|18|19|20| 
--------------- 
21|22|23|24|25| 
--------------- 

Или используя grouper рецепт, как @abarnert предложил:

for row in grouper(5, board): 
+0

Если вы хотите развлечься с помощью 'itertools', почему бы не просто' для строки в grouper (5, board): '(с рецептом из документов)? – abarnert

+0

@abarnert Я искал что-то подобное, но не смог найти его. Спасибо :) Я скоро порекомендую свой ответ с вашим предложением – HennyH

+1

Я лично считаю, что группа и некоторые другие рецепты должны быть в itertools. (Нет причин, по которым мы не можем иметь источник в разделе рецептов в качестве примера, и _also_ иметь его в модуле, правильно?) Если вы согласны, вы можете посмотреть на [more-itertools] (https: // pypi.python.org/pypi/more-itertools), который я абсолютно люблю. – abarnert

1

Просто для удовольствия, вот 1-вкладыш, который создает пронумерованные строки:

['|'.join([str(y).center(4) for y in x]) for x in map(None,*[reversed(range(1,26))]*5)] 

Разорвать его немного, добавляя строки, еще не чистый ответ:

nums = map(None,*[reversed(range(1,26))]*5) 
rows = ['|'.join([str(y).center(4) for y in x]) for x in nums] 
board = ('\n'+'-'*len(rows[0])+'\n').join(rows) 
print board 
1

Несколько обобщенное решение, для матричного представления 2D:

board = [ [22, 1 , 33], [41, 121, 313], [0, 1, 123112312] ] 
maxd = max(len(str(v)) for b in board for v in b) + 1 
l = [] 
for b in board: 
    l.append("|"+" |".join([ '{n: {w}}'.format(n=v, w=maxd) for v in b]) + " |") 
sepl = "\n" + '-'*len(l[0]) + "\n" 
print sepl, sepl.join(l), sepl 
1

Я попробовал другой подход, используя списочные и String Format Mini-Language.

boardout = "".join([" {:<2} |".format(x) if (x-1)%5>0 else " {:<2} |\n{}\n".format(x, "-"*25) for x in range(25,0,-1)]) 
print boardout 

Это должно производить аналогичный вывод для ожидаемого выхода OP.EDIT: Благодаря @abarnert для перемещающегося наконечника.

+0

Если вы хотите выровнять по левому краю, просто используйте '{: <2}'. – abarnert

Смежные вопросы