2017-07-29 16 views
0

私はサブリストサブリストを表形式で自動的にフォーマットする方法は?

tableData = [['apples', 'oranges', 'cherries', 'banana'],['Alice', 'Bob', 'Carol', 'David'], ['dogs', 'cats', 'moose', 'goose']] 

が含まれている以下のリスト、私の目的は彼らに

apples Alice  dogs 
oranges  Bob  cats 
cherries Carol moose 
    banana David goose 

以下のコードは

In [55]: for nested_list in zip(*tableData): 
      print("{:>9} {:>9} {:>9}".format(*nested_list)) 

しかし、どのようなバグは私があることを行うそのようにフォーマットすることがあります各サブリストのフォーマットを手動で指定する必要があります。

私はforループを使って自動的にそれを行う方法を見つけようとしていましたが、それを行う方法に関連するものは何も見つかりませんでした。

いずれのヒントも歓迎されています。

ありがとうございました。これについて

答えて

1

方法:

for line in zip(*tableData): 
    for word in line: 
     print("{:>9}".format(word), end=' ') 
    print() 

説明


print()は欠席した場合は、すべてのサブリストはprint()この

のような単一の行に
apples  Alice  dogs oranges  Bob  cats cherries  Carol  moose banana  David  goose 

を置くことになります改行が可能

+0

こんにちは@ nutmeg64、それは素晴らしいです。最後の 'print()'の使い方はどうですか? –

+0

改行を印刷するだけです。 – nutmeg64

+0

cheers @ nutmeg64 –

1

あなただけの列の任意の数の書式コードとして{:>9}を使用したい場合は、これを試してみてください。

fieldFormat = ' '.join(['{:>9}'] * len(tableData)) 
for nestedList in zip(*tableData): 
    print(fieldFormat.format(*nestedList)) 

これだけで、{:>9}書式指定子のリストを作成したtableDataの各列に1つ、そして参加しますスペースと共にあなたも自動的にフィールド幅を計算したい場合は

、あなたはこれを行うことができます。

fieldWidths = [max(len(word) for word in col) for col in tableData] 
fieldFormat = ' '.join('{{:>{}}}'.format(wid) for wid in fieldWidths) 
for nestedList in zip(*tableData): 
    print(fieldFormat.format(*nestedList)) 

fieldWidthsは、各列の各単語の最大長さを計算リスト内包から生成されます。内側から:

(len(word) for word in col) 

これはcolの各単語の長さを生成する発電機です。

max(len(word) for word in col) 

maxに発電機(または任意の反復可能)を供給するイテラブルによって生産すべての最大値を計算します。

[max(len(word) for word in col) for col in tableData] 

このリスト内包はtableData内のデータの各列col内のすべての単語の最大長さを生成します。

fieldFormatは、fieldWidthsをフォーマット指定子に変換することによって生成されます。再び内側から:

'{{:>{}}}'.format(wid) 

これは、{:>#}形式にwidをフォーマット。 {{は、書式指定子に{を生成させる方法です。同様に、}}}を生成します。真ん中の{}は実際にはwidでフォーマットされます。

('{{:>{}}}'.format(wid) for wid in fieldWidths) 

これは、fieldWidthsにリストされている各幅に対して上記のフォーマットを行うジェネレータ関数です。

fieldFormat = ' '.join('{{:>{}}}'.format(wid) for wid in fieldWidths) 

これはちょうどfieldFormat書式指定子を作成するために、間にスペースとそれらのフォーマットを一緒に結合します。

+0

こんにちは、私の2番目の部分の説明をしてください。それは間違いなく助けになるだろう。前もって感謝します。 –

+0

Wow @ j-earls。そりゃ素晴らしい。あなたの優しい説明をありがとうございました。私はあなたに借りている、私はそれを意味する。私たちが一日会うと、食堂、昼食、または朝食が私の上にあります。 –

+1

答えを修正しました(もう一度) - 私は2番目の例の書式指定子で ':'と '>'を入れ替えました。今は良いはずです。 –