web-dev-qa-db-fra.com

Mise en forme des listes dans les colonnes d'une sortie de table (python 3)

J'ai des données qui sont collectées dans une boucle et stockées dans des listes distinctes qui contiennent uniquement les mêmes types de données (par exemple, uniquement des chaînes, uniquement des éléments flottants), comme indiqué ci-dessous:

names = ['bar', 'chocolate', 'chips']
weights = [0.05, 0.1, 0.25]
costs = [2.0, 5.0, 3.0]
unit_costs = [40.0, 50.0, 12.0]

J'ai traité ces listes comme des "colonnes" d'un tableau et je souhaite les imprimer comme un tableau formaté qui devrait ressembler à ceci:

Names     | Weights | Costs | Unit_Costs  
----------|---------|-------|------------
bar       | 0.05    | 2.0   | 40.0
chocolate | 0.1     | 5.0   | 50.0
chips     | 0.25    | 3.0   | 12.0

Je sais seulement comment imprimer des données de listes horizontalement sur des lignes de table. J'ai cherché en ligne (et sur ce site) de l'aide concernant ce problème. Cependant, je n'ai réussi à trouver de l'aide que pour le faire fonctionner avec Python 2.7 et non 3.5. .1 qui est ce que j'utilise.
Ma question est:
Comment puis-je obtenir des entrées des 4 listes ci-dessus pour les imprimer dans un tableau comme indiqué ci-dessus. 

Chaque index d’article des listes ci-dessus est associé (c’est-à-dire que l’entrée [0] des 4 listes est associée au même article; bar, 0,05, 2,0, 40,0). 

7
Jake Cannon

Quelques tableaux intéressants dessiner avec texttable.

import texttable as tt
tab = tt.Texttable()
headings = ['Names','Weights','Costs','Unit_Costs']
tab.header(headings)
names = ['bar', 'chocolate', 'chips']
weights = [0.05, 0.1, 0.25]
costs = [2.0, 5.0, 3.0]
unit_costs = [40.0, 50.0, 12.0]

for row in Zip(names,weights,costs,unit_costs):
    tab.add_row(row)

s = tab.draw()
print (s)

Résultat

+-----------+---------+-------+------------+
|   Names   | Weights | Costs | Unit_Costs |
+===========+=========+=======+============+
| bar       | 0.050   | 2     | 40         |
+-----------+---------+-------+------------+
| chocolate | 0.100   | 5     | 50         |
+-----------+---------+-------+------------+
| chips     | 0.250   | 3     | 12         |
+-----------+---------+-------+------------+

Vous pouvez installer texttable à l’aide de cette commande pip install texttable.

6
Rahul K P

Voici une petite implémentation qui fait ce que vous voulez en python de base (pas de modules spéciaux). 


names = ['bar', 'chocolate', 'chips']
weights = [0.05, 0.1, 0.25]
costs = [2.0, 5.0, 3.0]
unit_costs = [40.0, 50.0, 12.0]


titles = ['names', 'weights', 'costs', 'unit_costs']
data = [titles] + list(Zip(names, weights, costs, unit_costs))

for i, d in enumerate(data):
    line = '|'.join(str(x).ljust(12) for x in d)
    print(line)
    if i == 0:
        print('-' * len(line))

Sortie:


names       |weights     |costs       |unit_costs  
---------------------------------------------------
bar         |0.05        |2.0         |40.0        
chocolate   |0.1         |5.0         |50.0        
chips       |0.25        |3.0         |12.0        
2
Israel Unterman

Après avoir visité docs.python.org/3/library/functions.html#Zip (lien fourni par cdarke) 

J'ai réussi à trouver la solution dont j'avais besoin: 

en utilisant la méthode Zip, j'ai créé une nouvelle liste récapitulative des données associées:

# sort into rows of associated data and convert to list
rows = Zip(names, weights, costs, unit_costs)
summary = list(rows)

Une fois la nouvelle liste récapitulative trouvée, j'ai procédé au tri et à l'impression du tableau à l'intention de l'utilisateur (toutefois, je traiterai du formatage plus tard):

# Sort Alphabetically and print
summary.sort()
print()
print("*** Results shown below (alphabetically) ***")
print("Name\t\tWeight\tCost\tUnit Cost")
for item in summary:
    print("")
    for data in item:
        print(data, "\t", end='')

la sortie est la suivante:

*** Results shown below (alphabetically) ***
Name        Weight  Cost    Unit Cost

bar     0.05    2.0     40.0    
chips   0.25    3.0     12.0    
chocolate   0.1     5.0     50.0    

Merci à cdarke pour l'aide :)

0
Jake Cannon