2013-05-15 46 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