3

我有一个包含数字 25-1 的列表。我正在尝试像游戏板一样将其打印出来,所有数字都匹配:

在此处输入图像描述

我发现了如何通过这样做将这些行添加到列表中:

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

而且我知道如何在每行上打印 5 个数字。但我无法让所有数字排成一行。有没有办法做到这一点?

4

6 回答 6

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)
于 2013-05-15T23:53:17.123 回答
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):
于 2013-05-16T00:03:14.203 回答
1
board = range(25, 0, -1)
def printLine():
    print
    print "------------------------"
for c in board:
    print str(c).ljust(2),'|',
    if c % 5 == 1:
        printLine()

那段代码应该可以工作。

于 2013-05-15T23:58:57.437 回答
1

只是为了好玩,这是一个创建编号行的 1-liner:

['|'.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
于 2013-05-16T00:04:43.047 回答
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
于 2013-05-16T00:08:19.143 回答
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 的预期输出类似的输出。编辑:感谢@abarnert 的提示。

于 2013-05-16T00:15:55.807 回答