2017-07-29 2 views
0

J'ai la liste suivante, qui contient des sous-listescomment formater automatiquement les sous-listes de manière tabulaire?

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

Mon but est de les mettre en forme cette façon

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

Le code ci-dessous ne que

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

Pourtant, ce qui me dérange est Je dois spécifier manuellement le format de chaque sous-liste.

J'ai essayé de trouver un moyen de le faire automatiquement avec une boucle for, mais je n'ai rien trouvé de pertinent sur la façon de le faire.

Tous les conseils sont plus que bienvenus.

Merci.

Répondre

1

Que diriez-vous ceci:

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

Explication


Si les print() était absent, tous les sous-listes seraient mis sur une seule ligne comme celui-ci

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

Le print() permet une nouvelle ligne

+0

salut @ nutmeg64, c'est génial. Quelle est l'utilisation de 'print()' à la fin, s'il vous plaît? –

+0

Juste l'impression d'une nouvelle ligne – nutmeg64

+0

acclamations @ nutmeg64 –

1

Si vous voulez juste utiliser {:>9} comme le code de format avec un nombre arbitraire de colonnes, essayez ceci:

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

Ce juste crée une liste de {:>9} spécificateurs de format, un pour chaque colonne TableData, puis rejoint les ensemble avec des espaces.

Si vous voulez calculer automatiquement les largeurs de champ, ainsi, vous pouvez le faire:

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 est générée à partir d'une compréhension de la liste qui calcule la longueur maximale de chaque mot dans chaque colonne. De l'intérieur:

(len(word) for word in col) 

Ceci est un générateur qui produira la longueur de chaque mot dans col.

max(len(word) for word in col) 

alimentation du générateur (ou tout iterable) dans max va calculer la valeur maximale de tout produit par l'iterable.

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

Cette compréhension de liste produit la longueur maximale de tous les mots dans chaque colonne col de données dans tableData.

fieldFormat est ensuite produit en transformant fieldWidths en spécificateurs de format.Encore une fois à l'intérieur:

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

ces formats wid dans le format {:>#}. {{ est un moyen d'avoir un spécificateur de format produit un {; de même, }} produit }. Le {} au milieu est ce qui est réellement formaté avec wid.

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

Ceci est une fonction de générateur qui effectue le formatage ci-dessus pour chaque largeur répertoriée dans fieldWidths.

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

Ce juste rejoint ces formats ainsi que les espaces entre les deux pour créer le spécificateur de format fieldFormat.

+0

salut @ j-earls, pourriez-vous mettre quelques explications pour votre deuxième partie, s'il vous plaît. Cela aiderait certainement. Merci d'avance. –

+0

Wow @ j-earls. C'est brillant. Merci beaucoup pour votre gentille explication. Je te dois, je le pense. Si nous nous rencontrons un jour, le dîner ou le déjeuner ou le petit déjeuner est sur moi. –

+1

Juste corrigé la réponse (encore une fois) - J'avais échangé le ':' et '>' dans le spécificateur de format dans le 2ème exemple. Ça devrait être bon maintenant. –