2016-07-19 11 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]で "最大" の値。文字列のリストの場合、これはアルファベット順にソートするものを意味します。最初の列には「パイナップル」、2列目には「マイク」、3列目には「プラチナ」があります。あなたはその言葉の長さを使っています。

の長さは、という単語の長さです。代わりにこれを試してみてください:

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

len(word) for word in tableName[j]は、文字列の長さのリストに文字列のリストをオン「リスト内包」です。リストの理解はPython言語の大きな部分です。すでに見たことがない場合は、これを学ぶのに最適な時間です!

EDIT

は、ここでリストの内包が何をしているかの「バイ手」バージョンです:

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

私たちは、その後の最大の発見、すべての文字列の長さを集めていますそれらの長さ。

+0

こんにちは、ありがとう、私は詳細な答えを感謝します! 私は実際にはリストの中で最も長い単語を見つける方法を知らなかったので、私は方法を探知し、誤ってmaxを使用しました。 –

+1

あなたは 'len(max(tableName [j]、key = len))+ 2'を実行できますが、とにかく2つのlenがあります:) – danidee

+0

@danidee良い点!私はその解決策も好きです。 – smarx