2016-07-19 85 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