Saltar al contenido

Python: imprimir un diccionario como una tabla horizontal con encabezados

Queremos darte la mejor solución que descubrimos por todo internet. Nosotros deseamos que te resulte útil y si puedes comentarnos algo que nos pueda ayudar a mejorar hazlo con total libertad.

Solución:

Puedes usar string formato:

print ":<8 :<15 :<10".format('Key','Label','Number')
for k, v in d.iteritems():
    label, num = v
    print ":<8 :<15 :<10".format(k, label, num)

Producción:

Key      Label           Number    
1        Spices          38.0      
2        Other stuff     24.0      
3        Tea             44.0      
5        Fruit           5.0       
6        Textiles        37.0      
10       Contraband      1000.0 

Estaba buscando una solución con ancho de columnas desconocido para imprimir una tabla de base de datos. Asi que aqui esta:

def printTable(myDict, colList=None):
   """ Pretty print a list of dictionaries (myDict) as a dynamically sized table.
   If column names (colList) aren't specified, they will show in random order.
   Author: Thierry Husson - Use it as you want but don't blame me.
   """
   if not colList: colList = list(myDict[0].keys() if myDict else [])
   myList = [colList] # 1st row = header
   for item in myDict: myList.append([str(item[col] if item[col] is not None else '') for col in colList])
   colSize = [max(map(len,col)) for col in zip(*myList)]
   formatStr = ' | '.join([":<".format(i) for i in colSize])
   myList.insert(1, ['-' * i for i in colSize]) # Seperating line
   for item in myList: print(formatStr.format(*item))

Muestra:

printTable(['a':123,'bigtitle':456,'c':789,'a':'x','bigtitle':'y','c':'z', 
    'a':'2016-11-02','bigtitle':1.2,'c':78912313213123], ['a','bigtitle','c'])

Producción:

a          | bigtitle | c             
---------- | -------- | --------------
123        | 456      | 789           
x          | y        | z             
2016-11-02 | 1.2      | 78912313213123

En el contexto de Psycopg, puede usarlo de esta manera:

curPG.execute("SELECT field1, field2, ... fieldx FROM mytable")
printTable(curPG.fetchall(), [c.name for c in curPG.description])

Si necesita una variante para filas de varias líneas, aquí está:

def printTable(myDict, colList=None, sep='uFFFA'):
   """ Pretty print a list of dictionaries (myDict) as a dynamically sized table.
   If column names (colList) aren't specified, they will show in random order.
   sep: row separator. Ex: sep='n' on Linux. Default: dummy to not split line.
   Author: Thierry Husson - Use it as you want but don't blame me.
   """
   if not colList: colList = list(myDict[0].keys() if myDict else [])
   myList = [colList] # 1st row = header
   for item in myDict: myList.append([str(item[col] or '') for col in colList])
   colSize = [max(map(len,(sep.join(col)).split(sep))) for col in zip(*myList)]
   formatStr = ' | '.join([":<".format(i) for i in colSize])
   line = formatStr.replace(' | ','-+-').format(*['-' * i for i in colSize])
   item=myList.pop(0); lineDone=False
   while myList:
      if all(not i for i in item):
         item=myList.pop(0)
         if line and (sep!='uFFFA' or not lineDone): print(line); lineDone=True
      row = [i.split(sep,1) for i in item]
      print(formatStr.format(*[i[0] for i in row]))
      item = [i[1] if len(i)>1 else '' for i in row]

Muestra:

sampleDict = ['multi lines title': 12, 'bigtitle': 456, 'third column': '7 8 9',
'multi lines title': 'w x y z', 'bigtitle': 'b1 b2', 'third column': 'z y x',
'multi lines title': '2', 'bigtitle': 1.2, 'third column': 78912313213123]

printTable(sampleDict, sep=' ')

Producción:

bigtitle | multi | third         
         | lines | column        
         | title |               
---------+-------+---------------
456      | 12    | 7             
         |       | 8             
         |       | 9             
---------+-------+---------------
b1       | w     | z             
b2       | x     | y             
         | y     | x             
         | z     |               
---------+-------+---------------
1.2      | 2     | 78912313213123

Sin sep parámetro, printTable(sampleDict) te dio:

bigtitle | multi lines title | third column  
---------+-------------------+---------------
456      | 12                | 7 8 9         
b1 b2    | w x y z           | z y x         
1.2      | 2                 | 78912313213123

Preferiría pandas DataFrame

import pandas as pd
data = 'Name': ['a', 'b', 'c'], 'Age': [10, 11, 12]
df = pd.DataFrame(data)
print(df)

Producción:

  Name  Age
0    a   10
1    b   11
2    c   12

consulte más información sobre cómo imprimir un marco de datos bonito aquí

Si tienes algún recelo o disposición de arreglar nuestro tutorial eres capaz de escribir una explicación y con mucho gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *