2015-05-29 1 views
16

Esiste un modo (esistente) per visualizzare un dizionario python come tabella html in un blocco appunti ipython. Dire che ho un dizionarioDizionario Python come tabella html nel notebook ipython

d = {'a': 2, 'b': 3} 

poi ho eseguito

magic_ipython_function(d) 

di darmi qualcosa come

enter image description here

+0

Dai un'occhiata al sistema di visualizzazione ricco di IPython: http://nbviewer.ipython.org/github/ipython/ipython/blob/1.x/examples/notebooks/Part%205%20-%20Rich%20Display%20System.ipynb #HTML – fouronnes

risposta

11

È possibile scrivere una funzione personalizzata per sostituire il valore predefinito _repr_html_ funzioni.

class DictTable(dict): 
    # Overridden dict class which takes a dict in the form {'a': 2, 'b': 3}, 
    # and renders an HTML Table in IPython Notebook. 
    def _repr_html_(self): 
     html = ["<table width=100%>"] 
     for key, value in self.iteritems(): 
      html.append("<tr>") 
      html.append("<td>{0}</td>".format(key)) 
      html.append("<td>{0}</td>".format(value)) 
      html.append("</tr>") 
     html.append("</table>") 
     return ''.join(html) 

Poi, utilizzarlo come:

DictTable(d) 

uscita sarà: Sample Output of DictTable

Se avete intenzione di gestire i dati molto più grandi (migliaia di articoli), considerare l'idea con i panda.

Fonte dell'idea: Blog post of ListTable

+1

Piccola regolazione per python 3: usa 'per chiave, valore in iter (self.items()):' per il ciclo –

12

probabilmente siete alla ricerca di qualcosa di simile ipy_table.

Un altro modo sarebbe utilizzare pandas per un dataframe, ma potrebbe essere eccessivo.

+1

Sembra interessante, specialmente la possibilità di abbellire i tavoli. – greole

3

Un modo per farlo, ma certamente un modo hacky, è quello di utilizzare json2html

from json2html import * 
from IPython.display import HTML 
HTML(json2html.convert(json = {'a':'2','b':'3'})) 

ma ha bisogno di una libreria di terze parti

1

IPython notebook utilizzerà il metodo di _repr_html_ per il rendering HTML uscita di qualsiasi oggetto avente un metodo _repr_html_

import markdown 
class YourClass(str): 
    def _repr_html_(self): 
     return markdown.markdown(self) 
d = {'a': 2, 'b': 3} 
rows = ["| %s | %s |" % (key, value) for key, value in d.items()] 
table = "------\n%s\n------\n" % ('\n'.join(rows)) 
YourClass(table) 

esigenze Questa soluzione la libreria di terze parti markdown

+0

Il risultato è un errore "ImportError: No module named markdown" – greole

+0

è necessario aggiungere markdown nel tuo PYTHONPATH – wolfrevo

+0

Ok colpa mia! Ho avuto un refuso quando ho cercato markdown su pypi. – greole

1

Non direi che i Panda sono un eccesso, poiché è possibile utilizzare DataFrame come un dettato, tra le altre cose.

In ogni caso, si può fare:

pd.DataFrame.from_dict(d, orient="index") 

o

pd.DataFrame(d.values(), index=d.keys()) 
5

Codice lavoro: testato in Python 2.7.9 e Python 3.3.5

In [1]:

from ipy_table import * 

# dictionary 
dict = {'a': 2, 'b': 3} 

# lists 
temp = [] 
dictList = [] 

# convert the dictionary to a list 
for key, value in dict.iteritems(): 
    temp = [key,value] 
    dictList.append(temp) 

# create table with make_table 
make_table(dictList) 

# apply some styles to the table after it is created 
set_column_style(0, width='100', bold=True, color='hsla(225, 80%, 94%, 1)') 
set_column_style(1, width='100') 

# render the table 
render() 

[1] Out:

table screenshot


Ottenere il codice HTML generato:

In [2]:

render()._repr_html_() 

Out [2]:

'<table border="1" cellpadding="3" cellspacing="0" style="border:1px solid black;border-collapse:collapse;"><tr><td style="background-color:hsla(225, 80%, 94%, 1);width:100px;"><b>a</b></td><td style="width:100px;">2</td></tr><tr><td style="background-color:hsla(225, 80%, 94%, 1);width:100px;"><b>b</b></td><td style="width:100px;">3</td></tr></table>' 


Riferimenti:
http://epmoyer.github.io/ipy_table/
http://nbviewer.ipython.org/github/epmoyer/ipy_table/blob/master/ipy_table-Introduction.ipynb
http://nbviewer.ipython.org/github/epmoyer/ipy_table/blob/master/ipy_table-Reference.ipynb

+1

Il tuo 'dictList' qui è equivalente a' dict.items() ', non è vero? Credo che le variabili for-loop e temporanee non siano necessarie. – keturn