web-dev-qa-db-fra.com

Dictionnaire Python en tant que table HTML dans le cahier ipython

Existe-t-il un moyen (existant) d'afficher un dictionnaire python sous forme de table html dans un cahier ipython? Dis que j'ai un dictionnaire

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

alors je cours

magic_ipython_function(d)

pour me donner quelque chose comme 

enter image description here

17
greole

Vous pouvez écrire une fonction personnalisée pour remplacer la fonction _repr_html_ par défaut. 

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)

Ensuite, utilisez-le comme:

DictTable(d)

La sortie sera: Sample Output of DictTable

Si vous manipulez des données beaucoup plus volumineuses (des milliers d'éléments), envisagez d'aller avec des pandas.

Source de l’idée: Article de blog de ListTable

12
Gurupad Hegde

Vous cherchez probablement quelque chose comme ipy_table .

Une autre méthode consisterait à utiliser pandas pour un cadre de données, mais cela pourrait être excessif.

12
Ami Tavory

Code de travail: Testé en Python 2.7.9 et Python 3.3.5

En 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()

Out [1]:

table screenshot


Récupère le code HTML généré:

En 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>'


Références:
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

5
jesterjunk

Une façon de le faire, mais il est vrai que c'est un hacky, est d'utiliser json2html

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

mais il faut une bibliothèque tierce

3
greole

Je ne dirais pas que les pandas sont excessifs, car vous pourriez utiliser DataFrame comme dictée, entre autres choses.

Quoi qu'il en soit, vous pouvez faire:

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

ou

pd.DataFrame(d.values(), index=d.keys())
3
jrjc

IPython Notebook utilisera la méthode _repr_html_ pour restituer la sortie HTML de tout objet ayant une méthode _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)

Cette solution nécessite la troisième partie de la bibliothèque markdown

1
wolfrevo

Si vous souhaitez ultérieurement externaliser le modèle HTML et conserver le contrôle, il peut être judicieux d'utiliser un moteur templating. Pour cela, vous pouvez utiliser Jinja (il s’agit plutôt d’un standard en Python).

from jinja2 import Template
from IPython.display import HTML

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

# content of the template that can be externalised
template_content = """
<table>
{% for key, value in data.items() %}
   <tr>
        <th> {{ key }} </th>
        <td> {{ value }} </td>
   </tr>
{% endfor %}
</table>"""

template = Template(template_content)

# template rendering embedded in the HTML representation
HTML(template.render(data=d))

 enter image description here

1
Romain