Я знаю, что где-то раньше видел какой-то пример, но хоть убей, я не могу найти его, когда гуглил.
У меня есть несколько строк данных:
data = [[1,2,3],
[4,5,6],
[7,8,9],
]
И я хочу вывести эти данные в таблицу, например
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+
Очевидно, я мог бы использовать библиотеку вроде prettytable или скачать панд или что-то в этом роде, но мне это очень неинтересно.
Я просто хочу вывести свои строки в виде таблиц в ячейку записной книжки Jupyter. Как мне это сделать?
python
jupyter-notebook
Уэйн Вернер
источник
источник
print
функции? У чисел фиксированная ширина (1 цифра, три цифры?Ответы:
Я только что обнаружил что tabulate имеет опцию HTML и довольно прост в использовании.
Очень похоже на ответ Уэйна Вернера:
from IPython.display import HTML, display import tabulate table = [["Sun",696000,1989100000], ["Earth",6371,5973.6], ["Moon",1737,73.5], ["Mars",3390,641.85]] display(HTML(tabulate.tabulate(table, tablefmt='html')))
Все еще ищу что-то простое в использовании для создания более сложных макетов таблиц, например, с латексным синтаксисом и форматированием для объединения ячеек и выполнения подстановки переменных в записной книжке:
разрешить ссылки на переменные Python в ячейках Markdown # 2958
источник
tabulate.tabulate(table, tablefmt='html')
кажется, что он работает (пробовал Jupyter 6.0.3, JupyterLab 2.0.1). Ницца!Есть хороший трюк: оберните данные с помощью pandas DataFrame.
import pandas as pd data = [[1, 2], [3, 4]] pd.DataFrame(data, columns=["Foo", "Bar"])
Он отображает такие данные, как:
| Foo | Bar | 0 | 1 | 2 | 1 | 3 | 4 |
источник
to_html()
см stackoverflow.com/a/29665452/2866660Я наконец нашел документацию по jupyter / IPython которую искал.
Мне это было нужно:
from IPython.display import HTML, display data = [[1,2,3], [4,5,6], [7,8,9], ] display(HTML( '<table><tr>{}</tr></table>'.format( '</tr><tr>'.join( '<td>{}</td>'.format('</td><td>'.join(str(_) for _ in row)) for row in data) ) ))
(Возможно, я немного испортил понимание, но
display(HTML('some html here'))
это то, что нам нужно)источник
Tabletext подходит для этого хорошо
import tabletext data = [[1,2,30], [4,23125,6], [7,8,999], ] print tabletext.to_text(data)
результат:
┌───┬───────┬─────┐ │ 1 │ 2 │ 30 │ ├───┼───────┼─────┤ │ 4 │ 23125 │ 6 │ ├───┼───────┼─────┤ │ 7 │ 8 │ 999 │ └───┴───────┴─────┘
источник
Если вы не против использовать немного HTML, что-то вроде этого должно сработать.
from IPython.display import HTML, display def display_table(data): html = "<table>" for row in data: html += "<tr>" for field in row: html += "<td><h4>%s</h4><td>"%(field) html += "</tr>" html += "</table>" display(HTML(html))
А затем используйте это так
data = [[1,2,3],[4,5,6],[7,8,9]] display_table(data)
источник
Вы можете попробовать использовать следующую функцию
def tableIt(data): for lin in data: print("+---"*len(lin)+"+") for inlin in lin: print("|",str(inlin),"", end="") print("|") print("+---"*len(lin)+"+") data = [[1,2,3,2,3],[1,2,3,2,3],[1,2,3,2,3],[1,2,3,2,3]] tableIt(data)
источник
Хорошо, это было немного сложнее, чем я думал:
def print_matrix(list_of_list): number_width = len(str(max([max(i) for i in list_of_list]))) cols = max(map(len, list_of_list)) output = '+'+('-'*(number_width+2)+'+')*cols + '\n' for row in list_of_list: for column in row: output += '|' + ' {:^{width}d} '.format(column, width = number_width) output+='|\n+'+('-'*(number_width+2)+'+')*cols + '\n' return output
Это должно работать для переменного количества строк, столбцов и количества цифр (для чисел)
data = [[1,2,30], [4,23125,6], [7,8,999], ] print print_matrix(data) >>>>+-------+-------+-------+ | 1 | 2 | 30 | +-------+-------+-------+ | 4 | 23125 | 6 | +-------+-------+-------+ | 7 | 8 | 999 | +-------+-------+-------+
источник
Набор функций общего назначения для визуализации любой структуры данных Python (слов и списков, вложенных вместе) в виде HTML.
from IPython.display import HTML, display def _render_list_html(l): o = [] for e in l: o.append('<li>%s</li>' % _render_as_html(e)) return '<ol>%s</ol>' % ''.join(o) def _render_dict_html(d): o = [] for k, v in d.items(): o.append('<tr><td>%s</td><td>%s</td></tr>' % (str(k), _render_as_html(v))) return '<table>%s</table>' % ''.join(o) def _render_as_html(e): o = [] if isinstance(e, list): o.append(_render_list_html(e)) elif isinstance(e, dict): o.append(_render_dict_html(e)) else: o.append(str(e)) return '<html><body>%s</body></html>' % ''.join(o) def render_as_html(e): display(HTML(_render_as_html(e)))
источник
У меня была такая же проблема. Я не смог найти ничего, что могло бы мне помочь, поэтому в итоге я создал класс
PrintTable
--code ниже. Также есть выход. Использование простое:или одной строкой:
Вывод:
------------------------------------------------------------------------------------------------------------- Name | Column 1 | Column 2 | Column 3 | Column 4 | Column 5 ------------------------------------------------------------------------------------------------------------- Very long name 0 | 0 | 0 | 0 | 0 | 0 Very long name 1 | 1 | 2 | 3 | 4 | 5 Very long name 2 | 2 | 4 | 6 | 8 | 10 Very long name 3 | 3 | 6 | 9 | 12 | 15 Very long name 4 | 4 | 8 | 12 | 16 | 20 Very long name 5 | 5 | 10 | 15 | 20 | 25 Very long name 6 | 6 | 12 | 18 | 24 | 30 Very long name 7 | 7 | 14 | 21 | 28 | 35 Very long name 8 | 8 | 16 | 24 | 32 | 40 Very long name 9 | 9 | 18 | 27 | 36 | 45 Very long name 10 | 10 | 20 | 30 | 40 | 50 Very long name 11 | 11 | 22 | 33 | 44 | 55 Very long name 12 | 12 | 24 | 36 | 48 | 60 Very long name 13 | 13 | 26 | 39 | 52 | 65 Very long name 14 | 14 | 28 | 42 | 56 | 70 Very long name 15 | 15 | 30 | 45 | 60 | 75 Very long name 16 | 16 | 32 | 48 | 64 | 80 Very long name 17 | 17 | 34 | 51 | 68 | 85 Very long name 18 | 18 | 36 | 54 | 72 | 90 Very long name 19 | 19 | 38 | 57 | 76 | 95 -------------------------------------------------------------------------------------------------------------
Код для класса
PrintTable
# -*- coding: utf-8 -*- # Class class PrintTable: def __init__(self, values, captions, widths, aligns): if not all([len(values[0]) == len(x) for x in [captions, widths, aligns]]): raise Exception() self._tablewidth = sum(widths) + 3*(len(captions)-1) + 4 self._values = values self._captions = captions self._widths = widths self._aligns = aligns def print(self): self._printTable() def _printTable(self): formattext_head = "" formattext_cell = "" for i,v in enumerate(self._widths): formattext_head += "{" + str(i) + ":<" + str(v) + "} | " formattext_cell += "{" + str(i) + ":" + self._aligns[i] + str(v) + "} | " formattext_head = formattext_head[:-3] formattext_head = " " + formattext_head.strip() + " " formattext_cell = formattext_cell[:-3] formattext_cell = " " + formattext_cell.strip() + " " print("-"*self._tablewidth) print(formattext_head.format(*self._captions)) print("-"*self._tablewidth) for w in self._values: print(formattext_cell.format(*w)) print("-"*self._tablewidth)
Демонстрация
# Demonstration headername = ["Column {}".format(x) for x in range(6)] headername[0] = "Name" data = [["Very long name {}".format(x), x, x*2, x*3, x*4, x*5] for x in range(20)] PrintTable(data, \ headername, \ [70, 10, 10, 10, 10, 10], \ ["<",">",">",">",">",">"]).print()
источник
Недавно я использовал
prettytable
для рендеринга красивую таблицу ASCII. Это похоже на вывод CLI postgres.import pandas as pd from prettytable import PrettyTable data = [[1,2,3],[4,5,6],[7,8,9]] df = pd.DataFrame(data, columns=['one', 'two', 'three']) def generate_ascii_table(df): x = PrettyTable() x.field_names = df.columns.tolist() for row in df.values: x.add_row(row) print(x) return x generate_ascii_table(df)
Вывод:
+-----+-----+-------+ | one | two | three | +-----+-----+-------+ | 1 | 2 | 3 | | 4 | 5 | 6 | | 7 | 8 | 9 | +-----+-----+-------+
источник
Я хочу вывести таблицу, в которой каждый столбец имеет наименьшую возможную ширину, где столбцы заполнены пробелами (но это можно изменить), а строки разделены символами новой строки (но это можно изменить) и где каждый элемент отформатирован с использованием
str
( но...).def ftable(tbl, pad=' ', sep='\n', normalize=str): # normalize the content to the most useful data type strtbl = [[normalize(it) for it in row] for row in tbl] # next, for each column we compute the maximum width needed w = [0 for _ in tbl[0]] for row in strtbl: for ncol, it in enumerate(row): w[ncol] = max(w[ncol], len(it)) # a string is built iterating on the rows and the items of `strtbl`: # items are prepended white space to an uniform column width # formatted items are `join`ed using `pad` (by default " ") # eventually we join the rows using newlines and return return sep.join(pad.join(' '*(wid-len(it))+it for wid, it in zip(w, row)) for row in strtbl)
Сигнатура функции
ftable(tbl, pad=' ', sep='\n', normalize=str)
с аргументами по умолчанию предназначена для обеспечения максимальной гибкости.Вы можете настроить
pad='&', sep='\\\\\n'
чтобы иметь большую часть таблицы LaTeX)str
но если вы знаете, что все ваши данные являются с плавающей запятой, этоlambda item: "%.4f"%item
может быть разумным выбором и т. д.Поверхностное тестирование:
Мне нужны некоторые тестовые данные, возможно, содержащие столбцы разной ширины, чтобы алгоритм был немного более сложным (но совсем немного;)
In [1]: from random import randrange In [2]: table = [[randrange(10**randrange(10)) for i in range(5)] for j in range(3)] In [3]: table Out[3]: [[974413992, 510, 0, 3114, 1], [863242961, 0, 94924, 782, 34], [1060993, 62, 26076, 75832, 833174]] In [4]: print(ftable(table)) 974413992 510 0 3114 1 863242961 0 94924 782 34 1060993 62 26076 75832 833174 In [5]: print(ftable(table, pad='|')) 974413992|510| 0| 3114| 1 863242961| 0|94924| 782| 34 1060993| 62|26076|75832|833174
источник