2016-07-19 94 views
2

我目前正在研究這個快速項目來學習,我半成功地完成了將每個列表打印到列中,但我遇到了打印正確列寬的麻煩。列寬 - 初學者python

fruitNamePets = [ ['apples', 'oranges', 'cherries', 'bananas', 'pineapples', 'mangos'], 
        ['Alice', 'Bob', 'Carol', 'David', 'Mike', 'Alex'], 
        ['dogs', 'cats', 'moose', 'goose', 'deer', 'platypus'] 
       ] 

def printTable(tableName): 
    colWidths = [0] * len(tableName)     
    for i in range(len(tableName[1])): 
     print ('')   
     for j in range(len(tableName)):    
      colWidths[j] = len(max(tableName[j])) + 2 
      print (str(tableName[j][i]).rjust(colWidths[j], ' '), end='') 

printTable(fruitNamePets) 

這裏是輸出

 apples Alice  dogs 
    oranges Bob  cats 
    cherries Carol  moose 
    bananas David  goose 
    pineapples Mike  deer 
     mangos Alex platypus 

正如你所看到的,我右對齊列和作出的寬度列表的最大長度+2艙,但由於某種原因,中間列只增加+1空間。

感謝您的幫助,我是新來的,所以如果我發佈的不正確,請讓我知道!

+0

不直接回答你的問題,但Python'.format'方法本身處理了很多這些東西:https://docs.python.org/2/library/string.html#format-specification-mini-語言(特別參見'align'參數);這可能會讓你的生活更容易對齊事物。 – val

回答

2

的問題是這一行:

colWidths[j] = len(max(tableName[j])) + 2 

max(tableName[j])回報你tableName[j] 「最大」 值。在字符串列表的情況下,這意味着按字母順序排列最高的字符串。第一列的「菠蘿」,第二列的「邁克」,第三列的「鴨嘴獸」。然後你用這個詞的長度。

你真正想要的是最長的字的長度。試試這個:

colWidths[j] = max(len(word) for word in tableName[j]) + 2 

len(word) for word in tableName[j]是「列表理解」,輪流字符串列表到字符串長度的列表。列表理解是Python語言的重要組成部分,所以如果您還沒有看到它,這是學習它的好時機!

編輯

這裏是什麼樣的名單理解是做了「通過手」的版本:

lengths = [] 
for word in tableName[j]: 
    lengths.append(len(word)) 
colWidths[j] = max(lengths) + 2 

我們正在收集字符串的所有長度,然後找到的最大那些長度。

+0

嘿,謝謝感謝您的詳細解答! 我實際上不知道如何找到列表中最長的單詞,所以我搜索了一個方法並錯誤地使用了最大值。 –

+1

或者你可以做'len(max(tableName [j],key = len))+ 2' ....但是有兩個很多len的東西:) – danidee

+0

@danidee好點!我也喜歡這個解決方案。 – smarx