2013-05-15 47 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)'?当然,你可以在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'去玩,那么为什么不用'在石斑鱼(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

一个有些通用的解决方案,对于二维矩阵表示:

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的预期输出。编辑:感谢@abarnert转移提示。

+0

如果你想要左对齐,只需使用'{:<2}'。 – abarnert